* fix example that is still in 1.0.x state.

git-svn-id: trunk@15493 -
This commit is contained in:
marco 2010-06-29 18:27:53 +00:00
parent 60041ebf8b
commit 257440153f
2 changed files with 27 additions and 31 deletions

View File

@ -3,7 +3,7 @@ program sfplay;
{$mode objfpc}
{$h+}
uses sndfile,linux;
uses sndfile, baseunix;
Const
BUFFERLEN = 1024;
@ -29,7 +29,6 @@ ResourceString
SErrSetSyncMode = 'Could not set sync mode';
Procedure PlayError(Msg : String);
begin
Writeln(stderr,Msg);
Halt(1);
@ -38,68 +37,64 @@ end;
Function OpenDSPDevice(Channels,Samplerate : LongInt) : LongInt; forward;
procedure PlayFile(FileName : String);
Var
Buffer : Array[0..BUFFERLEN-1] of word;
SoundFile : PSndFile;
Info : SF_INFO;
k, m, AudioDevice, readcount : Longint;
ScaleData : Boolean;
var
Buffer: Array[0..BUFFERLEN-1] of word;
SoundFile: PSndFile;
Info: TSF_INFO;
k, m, AudioDevice, readcount: Longint;
ScaleData: Boolean;
begin
Writeln(SPlaying,FileName);
SoundFile:=sf_open_read(pChar(FileName),@Info);
SoundFile:=sf_open(pChar(FileName), SFM_READ, @Info);
If (SoundFile=Nil) then
begin
sf_perror(Nil);
exit;
sf_perror(Nil);
exit;
end;
If not (Info.Channels in [1,2]) then
PlayError(SerrChannels);
AudioDevice:=OpenDSPDevice(Info.channels, Info.samplerate);
ScaleData:=(Info.pcmbitwidth < 16);
ScaleData:=(Info.samplerate < 16);
readcount:=sf_read_short(SoundFile,@Buffer,BUFFERLEN);
While ReadCount<>0 do
begin
If ScaleData then
For m:=0 to BufferLen-1 do
Buffer[m]:=buffer[m] * 256;
fdwrite (AudioDevice, buffer, readcount * sizeof (word)) ;
readcount:=sf_read_short(SoundFile,@Buffer,BUFFERLEN);
If ScaleData then
For m:=0 to BufferLen-1 do
Buffer[m]:=buffer[m] * 256;
FpWrite(AudioDevice, buffer, readcount * sizeof (word)) ;
readcount:=sf_read_short(SoundFile,@Buffer,BUFFERLEN);
end;
sf_close (Soundfile) ;
fdclose (AudioDevice) ;
FpClose(AudioDevice) ;
end;
Function OpenDSPDevice (channels,SampleRate : LongInt) : Longint;
var
fd, stereo, temp, error : longint ;
begin
fd:=fdOpen('/dev/dsp',OPEN_WRONLY,0);
fd:=fpOpen('/dev/dsp',O_WRONLY,0);
if fd<0 then
PlayError(SErrOpeningDevice);
Stereo:=0;
if Not ioctl(fd, SNDCTL_DSP_STEREO , @stereo) then
if Not (FpIOCtl(fd, SNDCTL_DSP_STEREO , @stereo) <> -1) then
PlayError(SErrSettingStereo);
if Not ioctl (fd, SNDCTL_DSP_RESET, Nil) then
if Not (FpIOCtl(fd, SNDCTL_DSP_RESET, Nil) <> -1) then
PlayError(SErrResettingDevice);
temp := 16 ;
If not ioctl (fd, SOUND_PCM_WRITE_BITS, @temp) then
If not (FpIOCtl(fd, SOUND_PCM_WRITE_BITS, @temp) <> -1) then
PlayError(SErrSetWriteBits);
If not ioctl (fd, SOUND_PCM_WRITE_CHANNELS, @channels) then
If not (FpIOCtl(fd, SOUND_PCM_WRITE_CHANNELS, @channels) <> -1) then
PlayError(SErrSetChannels);
If Not ioctl (fd, SOUND_PCM_WRITE_RATE, @SampleRate) then
If Not (FpIOCtl(fd, SOUND_PCM_WRITE_RATE, @SampleRate) <> -1) then
PlayError(SErrSetSampleRate);
If not ioctl (fd, SNDCTL_DSP_SYNC, Nil) then
If not (FpIOCtl(fd, SNDCTL_DSP_SYNC, Nil) <> -1) then
PlayError(SErrSetSyncMode);
OpenDSPDevice:=Fd;
end;
Var
I : Integer;
begin
For I:=1 to ParamCount do
PlayFile(Paramstr(i));

View File

@ -255,6 +255,7 @@ type
TSF_INFO = record
frames : Tsf_count_t; // Used to be called samples. Changed to avoid confusion.
samplerate : ctypes.cint;
channels : ctypes.cint;
format : ctypes.cint;
sections : ctypes.cint;
seekable : ctypes.cint;
@ -409,7 +410,7 @@ type
** to sf_perror () or sf_error_str ().
** All calls to sf_open() should be matched with a call to sf_close().
}
function sf_open (path : ctypes.pcchar; mode : ctypes.cint; sfinfo : PSF_INFO) : PSNDFILE; cdecl;
function sf_open (path : pChar; mode : ctypes.cint; sfinfo : PSF_INFO) : PSNDFILE; cdecl;
external sndfilelib name 'sf_open';
{