Einzelnen Beitrag anzeigen

HHick123

Registriert seit: 23. Jul 2007
73 Beiträge
 
#1

WaveIn-Problem bei grossen Buffern (Waveform Audio API)

  Alt 4. Feb 2008, 14:17
Hallo Leute!

Ich schreibe gerade ein Programm (XP Servicepack 2) mit WaveIn und WaveOut, wobei
ich EVENT_CALLBACK verwende.

Ich verwende jeweils 2 Buffer, wobei jeweils einer von mir vorbereitet wird,
während der andere aufgezeichnet bzw. gespielt wird.

Das klappt auch im Prinzip sehr gut, allerdings bekomme ich ein Problem
mit großen Buffergroessen (z.B. größer als 500ms oder größer als 1s)
und zwar nur bei manchen Soundkarten (z.B. beim Sennheiser PC-166-USB).

Das Problem äussert sich darin, dass in den aufgezeichneten Daten plötzlich
(teilweise mehrere 100ms lange) Stücke fehlen. Das Problem beginnt erst mit dem
Start von WaveOut (welches selber aber anstandslos funktioniert).

Bei der Benutzung von kleineren Buffern verschwindet das Problem plötzlich.

Die zurückgegebenen WaveIn-Buffer haben stets die erwartet Länge.
Alle Waveform-API-Calls liefern MMSYSERR_NOERROR.

Was könnte da sein???????
Ich bin schon reif fürs Irrenhaus!!!

Bin für jeden Hinweis dankbar.

Schönen Gruß, Helmut

Es folgt ein Trace der API-Calls eines Fehlerfalls (im Klammer stehen die Zeiten,
die der Call gedauert hat, Zeiten ermittelt mit PerformanceCounter). In dem Beispiel
läuft WaveIn immer und 2x wird etwas über WaveOut ausgegeben. Die Buffer sind 4 Sekunden lang.

0ms (160ms) WaveInOpen
160ms (24ms) WaveOutOpen
184ms (0ms) WaveOutPause
196ms (0ms) WaveInPrepareHeader 0
196ms (0ms) WaveInPrepareHeader 1
196ms (0ms) WaveOutPrepareHeader 0
196ms (0ms) WaveOutPrepareHeader 1
196ms (0ms) WaveInStart
197ms (0ms) WaveInAddBuffer 0
197ms (0ms) WaveInAddBuffer 1
4201ms -> EVENT OnInputBuffer 0
4201ms (0ms) WaveInUnprepareHeader 0
4201ms (0ms) WaveInPrepareHeader 0
4201ms (0ms) WaveInAddBuffer 0
8201ms -> EVENT OnInputBuffer 1
8201ms (0ms) WaveInUnprepareHeader 1
8201ms (0ms) WaveInPrepareHeader 1
8201ms (0ms) WaveInAddBuffer 1
8617ms (1ms) WaveOutWrite 0
8618ms (0ms) WaveOutRestart
8619ms (0ms) WaveInGetPosition
8619ms (0ms) WaveOutWrite 1
12471ms -> EVENT OnInputBuffer 0
12471ms (0ms) WaveInUnprepareHeader 0
12471ms (0ms) WaveInPrepareHeader 0
12471ms (0ms) WaveInAddBuffer 0
12762ms -> EVENT OnOutputBuffer 0
12762ms (0ms) WaveOutUnprepareHeader 0
12763ms (0ms) WaveOutPrepareHeader 0
12763ms (0ms) WaveOutWrite 0
16624ms -> EVENT OnOutputBuffer 1
16624ms (0ms) WaveOutUnprepareHeader 1
16624ms (0ms) WaveOutPrepareHeader 1
16624ms (0ms) WaveOutWrite 1
16685ms -> EVENT OnInputBuffer 1
16685ms (0ms) WaveInUnprepareHeader 1
16685ms (0ms) WaveInPrepareHeader 1
16685ms (0ms) WaveInAddBuffer 1
20624ms -> EVENT OnOutputBuffer 0
20624ms (0ms) WaveOutUnprepareHeader 0
20624ms (0ms) WaveOutPrepareHeader 0
20624ms -> EVENT OnTimeOut ENDOFPLAYBACK
20899ms -> EVENT OnInputBuffer 0
20899ms (0ms) WaveInUnprepareHeader 0
20899ms (0ms) WaveInPrepareHeader 0
20899ms (0ms) WaveInAddBuffer 0
24624ms -> EVENT OnOutputBuffer 1
24624ms (0ms) WaveOutUnprepareHeader 1
24624ms (0ms) WaveOutPrepareHeader 1
24624ms (0ms) WaveOutUnprepareHeader 0
24624ms (0ms) WaveOutUnprepareHeader 1
24625ms (33ms) WaveOutClose
24657ms (31ms) WaveOutOpen
24688ms (0ms) WaveOutPause
24688ms (0ms) WaveOutPrepareHeader 0
24688ms (0ms) WaveOutPrepareHeader 1
24899ms -> EVENT OnInputBuffer 1
24900ms (0ms) WaveInUnprepareHeader 1
24900ms (0ms) WaveInPrepareHeader 1
24900ms (0ms) WaveInAddBuffer 1
24901ms (0ms) WaveOutWrite 0
24901ms (0ms) WaveOutRestart
24901ms (0ms) WaveInGetPosition
24902ms (0ms) WaveOutWrite 1
28900ms -> EVENT OnInputBuffer 0
28900ms (0ms) WaveInUnprepareHeader 0
28900ms (0ms) WaveInPrepareHeader 0
28900ms (0ms) WaveInAddBuffer 0
28908ms -> EVENT OnOutputBuffer 0
28908ms (0ms) WaveOutUnprepareHeader 0
28908ms (0ms) WaveOutPrepareHeader 0
28908ms (0ms) WaveOutWrite 0
32900ms -> EVENT OnInputBuffer 1
32900ms (0ms) WaveInUnprepareHeader 1
32900ms (0ms) WaveInPrepareHeader 1
32900ms (0ms) WaveInAddBuffer 1
32908ms -> EVENT OnOutputBuffer 1
32908ms (0ms) WaveOutUnprepareHeader 1
32908ms (0ms) WaveOutPrepareHeader 1
32908ms (0ms) WaveOutWrite 1
36900ms -> EVENT OnInputBuffer 0
36900ms (0ms) WaveInUnprepareHeader 0
36900ms (0ms) WaveInPrepareHeader 0
36900ms (0ms) WaveInAddBuffer 0
36900ms -> EVENT OnTimeOut ENDOFPLAYBACK
36908ms -> EVENT OnOutputBuffer 0
36908ms (0ms) WaveOutUnprepareHeader 0
36908ms (0ms) WaveOutPrepareHeader 0
40900ms -> EVENT OnInputBuffer 1
40900ms (0ms) WaveInUnprepareHeader 1
40900ms (0ms) WaveInPrepareHeader 1
40900ms (0ms) WaveInAddBuffer 1
40908ms -> EVENT OnOutputBuffer 1
40908ms (0ms) WaveOutUnprepareHeader 1
40908ms (0ms) WaveOutPrepareHeader 1
40908ms (0ms) WaveOutUnprepareHeader 0
40908ms (0ms) WaveOutUnprepareHeader 1
40908ms (33ms) WaveOutClose
40941ms (37ms) WaveOutOpen
40978ms (0ms) WaveOutPause
40978ms (0ms) WaveOutPrepareHeader 0
40978ms (0ms) WaveOutPrepareHeader 1
40978ms (72ms) WaveInReset
41050ms (0ms) WaveInUnprepareHeader 0
41050ms (0ms) WaveInUnprepareHeader 1
41050ms (3ms) WaveInClose
41053ms (0ms) WaveOutUnprepareHeader 0
41053ms (0ms) WaveOutUnprepareHeader 1
41053ms (3ms) WaveOutClose

Hier noch ein Teil des Source-Codes:

--snipp--

[edit=Phoenix]Code auf Wunsch entfernt. War zu lang und hatte Fehler.
Die korrigierte Version als Download gibt es ein paar Beiträge weiter unten.
Mfg, Phoenix[/edit]
  Mit Zitat antworten Zitat