From b5a738fa52c8b0f2212deb5febd2d7f0b8f6544f Mon Sep 17 00:00:00 2001 From: tobigun Date: Fri, 9 May 2008 19:19:28 +0000 Subject: - input-source selection works now (with bass or portaudio with portmixer) - audio-effects (DSP) interface for audio-playback plus a simple voice removal example (does not sound that good) - FFMpeg support for BASS - audio-clock for FFMpeg for GetPosition and synchronisation - more compatible seeking in FFMpeg - clean termination of the audio interfaces/streams (especially ffmpeg) - Audio output device enumeration (selection will be added later to the sounds option screen) - display of threshold and volume in the record-options screen - threshold and volume can be changed with the 'T' (threshold) and '+'/'-' (source volume) keys - added a FadeIn() method to the IAudioPlayback interface - some minor changes to the audio classes/screens - new base-class for audio-playback classes (used by bass, portaudio and sdl) git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@1078 b956fd51-792f-4845-bead-9b4dfca2ff2c --- Game/Code/Classes/UAudioPlayback_SDL.pas | 46 +++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 7 deletions(-) (limited to 'Game/Code/Classes/UAudioPlayback_SDL.pas') diff --git a/Game/Code/Classes/UAudioPlayback_SDL.pas b/Game/Code/Classes/UAudioPlayback_SDL.pas index 6fc22242..ed5a208b 100644 --- a/Game/Code/Classes/UAudioPlayback_SDL.pas +++ b/Game/Code/Classes/UAudioPlayback_SDL.pas @@ -25,12 +25,15 @@ uses type TAudioPlayback_SDL = class(TAudioPlayback_SoftMixer) + private + function EnumDevices(): boolean; protected function InitializeAudioPlaybackEngine(): boolean; override; function StartAudioPlaybackEngine(): boolean; override; procedure StopAudioPlaybackEngine(); override; + function FinalizeAudioPlaybackEngine(): boolean; override; public - function GetName: String; override; + function GetName: String; override; procedure MixBuffers(dst, src: PChar; size: Cardinal; volume: Integer); override; end; @@ -53,14 +56,37 @@ begin result := 'SDL_Playback'; end; +function TAudioPlayback_SDL.EnumDevices(): boolean; +begin + // Note: SDL does not provide Device-Selection capabilities (will be introduced in 1.3) + ClearOutputDeviceList(); + SetLength(OutputDeviceList, 1); + OutputDeviceList[0] := TAudioOutputDevice.Create(); + OutputDeviceList[0].Name := '[SDL Default-Device]'; + Result := true; +end; + function TAudioPlayback_SDL.InitializeAudioPlaybackEngine(): boolean; var desiredAudioSpec, obtainedAudioSpec: TSDL_AudioSpec; -// err: integer; // Auto Removed, Unused Variable + SampleBufferSize: integer; begin result := false; - SDL_InitSubSystem(SDL_INIT_AUDIO); + EnumDevices(); + + if (SDL_InitSubSystem(SDL_INIT_AUDIO) = -1) then + begin + Log.LogError('SDL_InitSubSystem failed!', 'TAudioPlayback_SDL.InitializeAudioPlaybackEngine'); + exit; + end; + + SampleBufferSize := IAudioOutputBufferSizeVals[Ini.AudioOutputBufferSizeIndex]; + if (SampleBufferSize <= 0) then + begin + // Automatic setting defaults to 1024 samples + SampleBufferSize := 1024; + end; FillChar(desiredAudioSpec, sizeof(desiredAudioSpec), 0); with desiredAudioSpec do @@ -68,14 +94,14 @@ begin freq := 44100; format := AUDIO_S16SYS; channels := 2; - samples := Ini.SDLBufferSize; + samples := SampleBufferSize; callback := @SDLAudioCallback; userdata := Self; end; if(SDL_OpenAudio(@desiredAudioSpec, @obtainedAudioSpec) = -1) then begin - Log.LogStatus('SDL_OpenAudio: ' + SDL_GetError(), 'UAudioPlayback_SDL'); + Log.LogStatus('SDL_OpenAudio: ' + SDL_GetError(), 'TAudioPlayback_SDL.InitializeAudioPlaybackEngine'); exit; end; @@ -85,7 +111,7 @@ begin asfS16 ); - Log.LogStatus('Opened audio device', 'UAudioPlayback_SDL'); + Log.LogStatus('Opened audio device', 'TAudioPlayback_SDL.InitializeAudioPlaybackEngine'); result := true; end; @@ -97,8 +123,15 @@ begin end; procedure TAudioPlayback_SDL.StopAudioPlaybackEngine(); +begin + SDL_PauseAudio(1); +end; + +function TAudioPlayback_SDL.FinalizeAudioPlaybackEngine(): boolean; begin SDL_CloseAudio(); + SDL_QuitSubSystem(SDL_INIT_AUDIO); + Result := true; end; procedure TAudioPlayback_SDL.MixBuffers(dst, src: PChar; size: Cardinal; volume: Integer); @@ -116,5 +149,4 @@ initialization finalization AudioManager.Remove( singleton_AudioPlaybackSDL ); - end. -- cgit v1.2.3