[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