[fpc-pascal] Re: Playing sounds with standard components
Graeme Geldenhuys
graemeg.lists at gmail.com
Tue Jun 12 18:06:15 CEST 2012
On 12 June 2012 16:17, silvioprog <silvioprog at gmail.com> wrote:
>
> So, how to play audio (wav/mp3) with only SDL framework in Free Pascal?
Simply reading a SDL tutorial or two, will quickly let you understand
the following code. TSoundEngine is just an convenience class we
created to add extra sound events and possibly swap out sound library
frameworks in future - without needing to change our application code.
Simple design pattern practices to simply your application code and
hide complexity.
This is not the complete code, but is the gist of it.
uses
sdl_mixer,
sdl;
const
// Global default extension for sound files. Set up as needed.
SoundExt = '.wav';
type
PSoundBlock = {$IFDEF UseMusic}PMIX_Music{$ELSE}PMIX_Chunk{$ENDIF};
...
{ in our project, this code is in a TSoundPlayer class. Result is of
type PSoundBlock }
Result := {$IFDEF
UseMusic}Mix_LoadMUS{$ELSE}Mix_LoadWAV{$ENDIF}(PChar(aFilename));
if not Assigned(Result) then
SoundEngine.MixError;
...
constructor TSoundEngine.Create;
begin
if SDL_Init(SDL_INIT_AUDIO or SDL_INIT_TIMER) = -1 then
SDLError;
if Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT,
MIX_DEFAULT_CHANNELS, 1024) = -1 then
MixError;
{$IFDEF UseMusic}Mix_HookMusicFinished{$ELSE}Mix_ChannelFinished{$ENDIF}(@MusicFinished);
end;
destructor TSoundEngine.Destroy;
begin
PlayingStop;
MIX_CloseAudio;
SDL_Quit;
inherited Destroy;
end;
procedure TSoundEngine.PlayingStop;
begin
{$IFDEF UseMusic}
Mix_HaltMusic;
{$ELSE}
Mix_HaltChannel(1);
{$ENDIF}
end;
procedure TSoundEngine.PlayingStart(aMusic: PSoundBlock);
begin
{$IFDEF UseMusic}
if Mix_PlayMusic(aMusic, 0) <> 0 then
MixError;
{$ELSE}
Mix_PlayChannel(1,aMusic, 0)
{$ENDIF}
end;
procedure TSoundEngine.PlayingPause;
begin
{$IFDEF UseMusic}
Mix_PauseMusic;
{$ELSE}
Mix_Pause (1);
{$ENDIF}
end;
procedure TSoundEngine.PlayingContinue;
begin
{$IFDEF UseMusic}
Mix_ResumeMusic;
{$ELSE}
Mix_Resume (1);
{$ENDIF}
end;
--
Regards,
- Graeme -
_______________________________________________
fpGUI - a cross-platform Free Pascal GUI toolkit
http://fpgui.sourceforge.net
More information about the fpc-pascal
mailing list