Files
BlitzNext/#ThirdParty/fmodapi375win/samplesdelphi/Simple/simple.dpr
T

301 lines
11 KiB
ObjectPascal

//===============================================================================================
// SIMPLE.EXE
// Copyright (c), Firelight Multimedia, 1999-2000.
//
// This example demonstrates some fundamental FMOD usage, including device enumeration, output
// mode selection, loading and playing samples and a music file, and
// calling some runtime manipulation and information functions.
// Converted to Delphi by Bocevski Dragan mailto: d_bocevski@yahoo.com
//===============================================================================================
// History
//
// 2001/09/09 by Steve 'Sly' Williams
// - Updated to version 3.40
//
// 2000/12/15 by Steve 'Sly' Williams
// - Updated to version 3.30
//
// 2000/11/14 by Steve 'Sly' Williams
// - Fixed version check
// - Added FMODErrors to uses clause
// - Added check for Delphi 4 to change wVirtualKeyCode to wVirtualScanCode
//
// 2002/02/13 by Steve 'Sly' Williams
// - Updated for FMOD 3.50
//
// 2002/12/19 by Steve 'Sly' Williams
// - Updated for FMOD 3.61
//===============================================================================================
program simple;
uses
fmod, fmodtypes, fmoderrors, Windows;
{$APPTYPE CONSOLE}
var
dw, key: dword;
driver: Integer;
i: Longint;
enm: TFSoundOutputTypes;
h, h1: THandle;
buf: input_record;
c: coord;
s, sorder, srow, stime, schp, scpu: string;
channel: Integer;
samp1, samp2, samp3: PFSoundSample;
mdl: PFMusicModule;
paused: Boolean;
begin
SetLength(s, 80);
SetConsoleTitle('Example Simple (song player)');
h := GetStdHandle(STD_INPUT_HANDLE);
h1 := GetStdHandle(STD_OUTPUT_HANDLE);
Buf.EventType := Key_Event;
if FMOD_VERSION > FSOUND_GetVersion then
begin
WriteLn('Error: You are using FMOD version ', FSOUND_GetVersion: 3: 2, '. You should be using version ', FMOD_VERSION: 3: 2);
Exit;
end;
writeln('---------------------------------------------------------');
writeln('Output Type');
writeln('---------------------------------------------------------');
writeln('1 - Direct Sound');
writeln('2 - Windows Multimedia Waveout');
writeln('3 - A3D');
writeln('4 - NoSound');
writeln('---------------------------------------------------------'); // print driver names
writeln('Press a corresponding number or ESC to quit');
repeat
Sleep(50);
FlushConsoleInputBuffer(h);
repeat
ReadConsoleInput(h, buf, 1, dw);
until buf.Event.KeyEvent.bKeyDown = false;
{$IFDEF VER120}
Key := buf.Event.KeyEvent.wVirtualScanCode;
{$ELSE}
Key := buf.Event.KeyEvent.wVirtualKeyCode;
{$ENDIF}
case key of
ord('1'): FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND);
ord('2'): FSOUND_SetOutput(FSOUND_OUTPUT_WINMM);
ord('3'): FSOUND_SetOutput(FSOUND_OUTPUT_A3D);
ord('4'): FSOUND_SetOutput(FSOUND_OUTPUT_NOSOUND);
27: exit;
end;
until ((key >= ord('1')) and (key <= ord('4')));
// ==========================================================================================
// SELECT DRIVER
// ==========================================================================================
// The following list are the drivers for the output method selected above.
writeln('---------------------------------------------------------');
enm := FSOUND_GetOutput();
case enm of
FSOUND_OUTPUT_NOSOUND: write('NoSound');
FSOUND_OUTPUT_WINMM: write('Windows Multimedia Waveout');
FSOUND_OUTPUT_DSOUND: write('Direct Sound');
FSOUND_OUTPUT_A3D: write('A3D');
end;
writeln(' Driver list');
writeln('---------------------------------------------------------');
for i := 0 to FSOUND_GetNumDrivers() - 1 do
writeln(i + 1, ' - ', FSOUND_GetDriverName(i)); // print driver names
writeln('---------------------------------------------------------'); // print driver names
writeln('Press a corresponding number or ESC to quit');
repeat
FlushConsoleInputBuffer(h);
repeat
ReadConsoleInput(h, buf, 1, dw);
until buf.Event.KeyEvent.bKeyDown = false;
{$IFDEF VER120}
Key := buf.Event.KeyEvent.wVirtualScanCode;
{$ELSE}
Key := buf.Event.KeyEvent.wVirtualKeyCode;
{$ENDIF}
if (ord(key) = 27) then exit;
driver := ord(key) - ord('1');
until ((driver > 0) or (driver <= FSOUND_GetNumDrivers()));
FSOUND_SetDriver(driver); // Select sound card (0 = default)
// ==========================================================================================
// SELECT MIXER
// ==========================================================================================
FSOUND_SetMixer(FSOUND_MIXER_QUALITY_AUTODETECT);
// ==========================================================================================
// INITIALIZE
// ==========================================================================================
if not FSOUND_Init(44100, 64, 0) then
begin
writeln('Error! Initializing');
writeln(FMOD_ErrorString(FSOUND_GetError()));
FSOUND_Close();
exit;
end;
// ==========================================================================================
// LOAD SONG
// ==========================================================================================
mdl := FMUSIC_LoadSong('../../media/invtro94.s3m');
if mdl = nil then
begin
writeln('Error! Loading song');
writeln(FMOD_ErrorString(FSOUND_GetError()));
FSOUND_Close();
exit;
end;
// ==========================================================================================
// LOAD SAMPLES
// ==========================================================================================
// 8bit mono
samp1 := FSOUND_Sample_Load(FSOUND_FREE, '../../media/jaguar.wav', FSOUND_2D, 0, 0);
if samp1 = nil then
begin
writeln('Error! Loading sample1');
writeln(FMOD_ErrorString(FSOUND_GetError()));
FSOUND_Close();
exit;
end;
// 16bit mono
samp2 := FSOUND_Sample_Load(FSOUND_FREE, '../../media/drumloop.wav', FSOUND_2D, 0, 0);
if samp2 = nil then
begin
writeln('Error! Loading sample2');
writeln(FMOD_ErrorString(FSOUND_GetError()));
FSOUND_Close();
exit;
end;
// 16bit stereo
samp3 := FSOUND_Sample_Load(FSOUND_FREE, '../../media/chimes.wav', FSOUND_2D, 0, 0);
if samp2 = nil then
begin
writeln('Error! Loading sample3');
writeln(FMOD_ErrorString(FSOUND_GetError()));
FSOUND_Close();
exit;
end;
// ==========================================================================================
// DISPLAY HELP
// ==========================================================================================
write('FSOUND Output Method : ');
case (FSOUND_GetOutput()) of
FSOUND_OUTPUT_NOSOUND: writeln('FSOUND_OUTPUT_NOSOUND');
FSOUND_OUTPUT_WINMM: writeln('FSOUND_OUTPUT_WINMM');
FSOUND_OUTPUT_DSOUND: writeln('FSOUND_OUTPUT_DSOUND');
FSOUND_OUTPUT_A3D: writeln('FSOUND_OUTPUT_A3D');
end;
write('FSOUND Mixer : ');
case (FSOUND_GetMixer()) of
FSOUND_MIXER_BLENDMODE: writeln('FSOUND_MIXER_BLENDMODE');
FSOUND_MIXER_MMXP5: writeln('FSOUND_MIXER_MMXP5');
FSOUND_MIXER_MMXP6: writeln('FSOUND_MIXER_MMXP6');
FSOUND_MIXER_QUALITY_FPU: writeln('FSOUND_MIXER_QUALITY_FPU');
FSOUND_MIXER_QUALITY_MMXP5: writeln('FSOUND_MIXER_QUALITY_MMXP5');
FSOUND_MIXER_QUALITY_MMXP6: writeln('FSOUND_MIXER_QUALITY_MMXP6');
end;
writeln('FSOUND Driver : ', FSOUND_GetDriverName(FSOUND_GetDriver()));
writeln('=========================================================================');
writeln(' 1 Play 16bit sound at any time');
writeln(' 2 Play 8bit sound at any time');
writeln(' 3 Play 16bit STEREO sound at any time');
writeln(' Left arrow Rewind mod back 1 order');
writeln(' Right arrow FastForward mod forward 1 order');
writeln(' SPACE Pause/unpause music at any time');
writeln(' ESC Quit');
writeln('=========================================================================');
writeln('Playing ...', FMUSIC_GetName(mdl));
// ==========================================================================================
// START PLAYING!
// ==========================================================================================
FMUSIC_PlaySong(mdl);
FMUSIC_SetPanSeperation(mdl, 0.15); // 15% crossover
GetConsoleMode(h, dw);
SetConsoleMode(h, dw or ENABLE_PROCESSED_OUTPUT or ENABLE_PROCESSED_INPUT);
c.X := 1;
c.Y := 24;
repeat
FlushConsoleInputBuffer(h);
Sleep(50);
dw := 0;
PeekConsoleInput(h, buf, 1, dw);
if buf.Event.KeyEvent.bKeyDown then
begin
{$IFDEF VER120}
Key := buf.Event.KeyEvent.wVirtualScanCode;
{$ELSE}
Key := buf.Event.KeyEvent.wVirtualKeyCode;
{$ENDIF}
if dw = 1 then
if key <> 0 then
begin
if key = Ord('1') then
FSOUND_PlaySound(FSOUND_FREE, samp1)
else if key = Ord('2') then
FSOUND_PlaySound(FSOUND_FREE, samp2)
else if key = Ord('3') then
begin
channel := FSOUND_PlaySound(FSOUND_FREE, samp3);
FSOUND_SetPan(channel, FSOUND_STEREOPAN);
end
else if key = Ord(' ') then
begin
paused := FMUSIC_GetPaused(mdl);
FMUSIC_SetPaused(mdl, not paused);
end
else if key = VK_LEFT then
FMUSIC_SetOrder(mdl, FMUSIC_GetOrder(mdl) - 1)
else if key = VK_RIGHT then
FMUSIC_SetOrder(mdl, FMUSIC_GetOrder(mdl) + 1)
else if key = 27 then
begin
WriteLn;
FSOUND_Close();
Exit;
end;
end;
end;
// key:=0;
SetConsoleCursorPosition(h1, c);
str(FMUSIC_GetOrder(mdl), sorder);
str(FMUSIC_GetRow(mdl), srow);
str((FMUSIC_GetTime(mdl) / 1000): 6: 3, stime);
str(FSOUND_GetChannelsPlaying(), schp);
str(FSOUND_GetCPUUsage(): 7: 5, scpu);
s := 'order = ' + sorder + ' row = ' + srow + ' time = ' + stime + ' channels playing = ' + schp + ' cpu usage = ' + scpu;
WriteConsole(h1, pchar(s), length(s) - 1, dw, nil);
s := ' ';
until false;
// ==========================================================================================
// CLEANUP AND SHUTDOWN
// ==========================================================================================
FSOUND_Sample_Free(samp1);
FSOUND_Sample_Free(samp2);
FSOUND_Sample_Free(samp3);
FMUSIC_FreeSong(mdl);
FSOUND_Close();
end.