Ignore:
Timestamp:
Apr 23, 2012, 1:32:52 PM (12 years ago)
Author:
chronos
Message:
  • Modified: Supported AudioSystems is configured using include config file.
  • Added: Added playlist demo to Demo player.
  • Added: Working DSP audiosystem for playing using linux /dev/dsp device. DSP backend support only WAV file so far.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • CoolAudio/Systems/DSP/UAudioSystemDSP.pas

    r348 r352  
    11unit UAudioSystemDSP;
    22
     3{$I UCoolAudioConfig.inc}
    34{$mode delphi}{$H+}
    45
    56interface
    67
    7 //{$IFDEF AudioSystemDSP}
     8{$IFDEF AudioSystemDSP}
    89uses
    9   Classes, SysUtils, UAudioSystem, BaseUnix;
     10  Classes, SysUtils, UAudioSystem, BaseUnix, UWavFile, StdCtrls, ExtCtrls;
    1011
    1112type
     
    1718    FDeviceId: Integer;
    1819  public
     20    Channels: Integer;
     21    SampleRate: Integer; // Hz
     22    BitsPerSample: Integer;
    1923    procedure OpenDevice;
     24    procedure CloseDevice;
     25    constructor Create(AOwner: TComponent); override;
     26    destructor Destroy; override;
    2027  end;
    2128
     
    2330
    2431  TPlayerDSP = class(TPlayer)
     32  private
     33    FTimer: TTimer;
     34    procedure TimerExecute(Sender: TObject);
    2535  public
     36    WavFile: TWAVFile;
    2637    procedure Play; override;
    2738    procedure Pause; override;
    2839    procedure Stop; override;
     40    procedure Open; override;
     41    procedure Close; override;
     42    constructor Create(AOwner: TComponent); override;
     43    destructor Destroy; override;
    2944  end;
    3045
    31 //{$ENDIF}
     46const
     47  BUFFERLEN = 1024;
     48
     49const
     50  { Values obtained from a C program - These are complex (!) C macros }
     51  SNDCTL_DSP_STEREO = -1073459197;
     52  SNDCTL_DSP_RESET = 20480;
     53  SNDCTL_DSP_SYNC = 20481;
     54  SOUND_PCM_WRITE_BITS = -1073459195;
     55  SOUND_PCM_WRITE_CHANNELS = -1073459194;
     56  SOUND_PCM_WRITE_RATE = -1073459198;
     57
     58resourcestring
     59  SPlaying = 'Playing : ';
     60  SErrChannels = 'Error : Number of channels not supported: ';
     61  SErrOpeningDevice = 'Could not open sound device';
     62  SErrSettingStereo = 'Could not set stereo';
     63  SErrResettingDevice = 'Could not reset DSP device';
     64  SErrSetWriteBits = 'Could not set write bits to 16';
     65  SErrSetChannels = 'Could not set channels';
     66  SErrSetSampleRate = 'Could not set sync mode';
     67  SErrSetSyncMode = 'Could not set sync mode';
     68
     69{$ENDIF}
    3270
    3371implementation
     72
     73{$IFDEF AudioSystemDSP}
    3474
    3575{ TAudioSystemDSP }
     
    3777procedure TAudioSystemDSP.OpenDevice;
    3878var
    39   fd, Stereo, Temp, Error: Longint;
     79  Stereo, Error: Longint;
    4080begin
    41   fd := fpOpen('/dev/dsp', O_WRONLY, 0);
    42   if fd < 0 then
    43     PlayError(SErrOpeningDevice);
     81  Write('Openning /dev/dsp');
     82  FDeviceId := fpOpen('/dev/dsp', O_WRONLY, 0);
     83  if FDeviceId < 0 then
     84    raise Exception.Create(SErrOpeningDevice);
    4485  Stereo := 0;
    45   if not (FpIOCtl(fd, SNDCTL_DSP_STEREO, @Stereo) <> -1) then
    46     PlayError(SErrSettingStereo);
    47   if not (FpIOCtl(fd, SNDCTL_DSP_RESET, nil) <> -1) then
    48     PlayError(SErrResettingDevice);
    49   Temp := 16;
    50   if not (FpIOCtl(fd, SOUND_PCM_WRITE_BITS, @Temp) <> -1) then
    51     PlayError(SErrSetWriteBits);
    52   if not (FpIOCtl(fd, SOUND_PCM_WRITE_CHANNELS, @Channels) <> -1) then
    53     PlayError(SErrSetChannels);
    54   if not (FpIOCtl(fd, SOUND_PCM_WRITE_RATE, @SampleRate) <> -1) then
    55     PlayError(SErrSetSampleRate);
    56   if not (FpIOCtl(fd, SNDCTL_DSP_SYNC, nil) <> -1) then
    57     PlayError(SErrSetSyncMode);
    58   FDeviceId := Fd;
     86  if not (FpIOCtl(FDeviceId, SNDCTL_DSP_STEREO, @Stereo) <> -1) then
     87    raise Exception.Create(SErrSettingStereo);
     88  if not (FpIOCtl(FDeviceId, SNDCTL_DSP_RESET, nil) <> -1) then
     89    raise Exception.Create(SErrResettingDevice);
     90  if not (FpIOCtl(FDeviceId, SOUND_PCM_WRITE_BITS, @BitsPerSample) <> -1) then
     91    raise Exception.Create(SErrSetWriteBits);
     92  if not (FpIOCtl(FDeviceId, SOUND_PCM_WRITE_CHANNELS, @Channels) <> -1) then
     93    raise Exception.Create(SErrSetChannels);
     94  if not (FpIOCtl(FDeviceId, SOUND_PCM_WRITE_RATE, @SampleRate) <> -1) then
     95    raise Exception.Create(SErrSetSampleRate);
     96  if not (FpIOCtl(FDeviceId, SNDCTL_DSP_SYNC, nil) <> -1) then
     97    raise Exception.Create(SErrSetSyncMode);
     98  WriteLn(' device: ' + IntToStr(FDeviceId));
    5999end;
    60100
    61 //{$IFDEF AudioSystemDSP}
     101procedure TAudioSystemDSP.CloseDevice;
     102begin
     103  if FDeviceId >= 0 then FpClose(FDeviceId);
     104end;
     105
     106constructor TAudioSystemDSP.Create(AOwner: TComponent);
     107begin
     108  inherited;
     109  BitsPerSample := 16;
     110  Channels := 2;
     111  SampleRate := 44000;
     112end;
     113
     114destructor TAudioSystemDSP.Destroy;
     115begin
     116  inherited Destroy;
     117end;
    62118
    63119{ TPlayerMAD }
    64120
     121procedure TPlayerDSP.TimerExecute(Sender: TObject);
     122var
     123  Buffer: array of Byte;
     124  Size: Integer;
     125begin
     126  SetLength(Buffer, 10000);
     127  Size := WavFile.SourceFile.Read(PByte(Buffer)^, System.Length(Buffer));
     128  Write('Buf: ' + IntToStr(Size) + ', ');
     129  fpWrite(TAudioSystemDSP(AudioSystem).FDeviceId, PByte(Buffer)^, Size);
     130  FTimer.Interval := 100;
     131end;
     132
    65133procedure TPlayerDSP.Play;
    66134begin
    67   inherited Play;
    68 
     135  WriteLn('Stop');
     136  Stop;
     137  TAudioSystemDSP(AudioSystem).SampleRate := WavFile.SampleRate;
     138  TAudioSystemDSP(AudioSystem).Channels := WavFile.ChannelModeID;
     139  TAudioSystemDSP(AudioSystem).BitsPerSample := WavFile.BitsPerSample;
     140  TAudioSystemDSP(AudioSystem).OpenDevice;
     141  WriteLn('seek');
     142  WavFile.SourceFile.Seek(SizeOf(TWAVRecord), soFromBeginning);
     143  while WavFile.SourceFile.Position < WavFile.SourceFile.Size do
     144    TimerExecute(nil);
     145  WriteLn('int');
     146  FTimer.Interval := 10;
     147  FTimer.OnTimer := TimerExecute;
     148  WriteLn('ena');
     149  //FTimer.Enabled := True;
     150  WriteLn('true');
    69151end;
    70152
    71153procedure TPlayerDSP.Pause;
    72154begin
    73   inherited Pause;
     155  if FActive then FTimer.Enabled := not FTimer.Enabled;
    74156end;
    75157
     
    77159begin
    78160  inherited Stop;
     161  FTimer.Enabled := False;
     162  TAudioSystemDSP(AudioSystem).CloseDevice;
    79163end;
    80164
    81 //{$ENDIF}
     165procedure TPlayerDSP.Open;
     166begin
     167  inherited;
     168  WavFile.OpenFile(FFileName);
     169end;
    82170
     171procedure TPlayerDSP.Close;
     172begin
     173  inherited Close;
     174end;
     175
     176constructor TPlayerDSP.Create(AOwner: TComponent);
     177begin
     178  inherited;
     179  WavFile := TWAVFile.Create;
     180  FTimer := TTimer.Create(nil);
     181end;
     182
     183destructor TPlayerDSP.Destroy;
     184begin
     185  FreeAndNil(FTimer);
     186  FreeAndNil(WavFile);
     187  inherited Destroy;
     188end;
     189
     190{$ENDIF}
    83191
    84192end.
    85 
Note: See TracChangeset for help on using the changeset viewer.