Einzelnen Beitrag anzeigen

Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#8

Re: Soundkarte Frequenz wieder geben

  Alt 10. Feb 2008, 12:21
Also an einem stream ist nichts falsch.

Ich bin inzwischen soweit dass ich die WinMM.dll also das MMSystem will. jedoch blicke ich bei der Documentation im msdn nicht ganz durch.

Soweit bin ich gekommen:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, MMSystem, Classes, Windows;

var
  Wave : HWAVEOUT; { WaveOutHandle }
  WaveEx : TWaveFormatEx; { WaveEx Inhalt }
  Stream : TMemoryStream; { Stream zum abspiechern der Wellen }
  WaveHeader : TWaveHDR; { WaveHeader zum senden }

  AudioDrivers : Cardinal;
  AudioDriver : Cardinal; AudioInfo : WaveOutCaps;


{procedure SetVolume(Left, Right: Word); overload;
begin
  WriteLn('1');
end;

procedure SetVolume(Volume : Word); overload;
begin
  WriteLn('2');
  WriteLn(Volume);
end;}


begin

  { Audiotreiber ermitteln }
  AudioDrivers := waveOutGetNumDevs();
  { Alle Treiber durchlaufen }
  for AudioDriver := 0 to AudioDrivers do begin
    { Treiberinfos einholen }
    if waveOutGetDevCaps(AudioDriver, @AudioInfo, sizeof(WaveOutCaps)) = MMSYSERR_NOERROR then begin
      { Namen ausgeben }
      WriteLn(AudioInfo.szPname);
      { Infos ausdrucken }
      Write(' - MID : '); WriteLn(AudioInfo.wMid);
      Write(' - PID : '); WriteLn(AudioInfo.wPid);
      Write(' - Version : '); WriteLn(AudioInfo.vDriverVersion);
      Write(' - Formate : '); WriteLn(AudioInfo.dwFormats);
      Write(' - Channels : '); WriteLn(AudioInfo.wChannels);
      Write(' - Support : '); WriteLn(AudioInfo.dwSupport);
    end;
  end;

  { WaveEx Einstellungen }
  WaveEx.wFormatTag := WAVE_FORMAT_PCM; {PCM }
  WaveEx.nChannels := 2; { Stereo }
  WaveEx.nSamplesPerSec := 44100; { Sampelrate }
  WaveEx.wBitsPerSample := 16; { Bps }
  { Unwichtigeres }
  WaveEx.nBlockAlign := (WaveEx.nChannels * WaveEx.wBitsPerSample) div 8;
  WaveEx.nAvgBytesPerSec := WaveEx.nSamplesPerSec * WaveEx.nBlockAlign;
  WaveEx.cbSize := 0;

  { WaveForm-Audio Output Device öffnen }
  if MMSystem.waveOutOpen(@Wave,WAVE_MAPPER,@WaveEx,0,0,0) = MMSYSERR_NOERROR then
    WriteLn('WaveOut Open...')
  else
    Exit;

  { Datei einlesen }
  Stream := TMemoryStream.Create;
  Stream.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Blow3.wav');
  WriteLn(Stream.Size);

  { Datensatz erstellen }
  WaveHeader.lpData := Stream.Memory;
  WaveHeader.dwBufferLength := Stream.Size;
  WaveHeader.dwFlags := 0;


  { Header vorbereiten }
  if MMSystem.waveOutPrepareHeader(Wave,@WaveHeader,SizeOf(WaveHDR)) = MMSYSERR_NOERROR then
    WriteLn('Header prepared...')
  else
    Exit;

  { Einen Datensatz senden }
  if MMSystem.waveOutWrite(Wave,@WaveHeader,SizeOf(WaveHDR)) = MMSYSERR_NOERROR then
    WriteLn('Header writen...')
  else
    Exit;

  { Warten auf die Datensatzbeendung }
  while MMSystem.waveOutUnPrepareHeader(Wave,@WaveHeader,SizeOf(WaveHDR)) = WAVERR_STILLPLAYING do begin
    Sleep(100); //Warten
    WriteLn('Testing vor Unprepare'); //Ausgeben
  end;

  WriteLn('Header unprepared...');

  //This is the same
  //SetVolume($44,$44); SetVolume($44);

  //WriteLn($FF);

  //WriteLn($FF + $FF);

  Sleep(1000);

  { WaveForm-Audio Output Device schließen }
  MMSystem.waveOutClose(Wave);

  //PlaySound('Blow3.wav',0,0);

end.
Allerdings wir der Sound Blow3.wav nicht abgestielt, wo ist da jetzt mein denkfehler? schließlich höre ich ein rauschen
Lars
  Mit Zitat antworten Zitat