So, bin nun etwas weiter, WAVE_FORMAT_EXTENSIBLE ist das Zauberwort...
Wenn mir nun noch jemand mal das mit der Callbackfunktion verklickern könnte...
Hab soviel verstanden, daß sie von Window/Treiber aufgerufen wird, wenn der gerade abgespielte Puffer fertig ist und der nächste dran soll.
Aber dann höre ich doch ne Lücke...???
Dann hab ich mal was von zwei oder drei verwendeten Puffern gesehen, die mit pNext irgendwie verlinkt sind, aber begriffen hab ichs noch nicht...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| constructor TWaveOutDevice.Create(aDevNum: Integer; aChannels: Integer); var Mask: DWORD; fmt: TWaveFormatExtensible; begin FillChar(fmt, SizeOf(fmt), 0); m_Channels := aChannels;
fmt.Format.wFormatTag := WAVE_FORMAT_EXTENSIBLE; fmt.Format.nSamplesPerSec := cSamplesPerSec; fmt.Format.nChannels := m_Channels; fmt.Format.wBitsPerSample := cBitsPerSample; fmt.Format.nBlockAlign := (fmt.Format.wBitsPerSample shr 3) * fmt.Format.nChannels; fmt.Format.nAvgBytesPerSec := fmt.Format.nSamplesPerSec * fmt.Format.nBlockAlign; fmt.Format.cbSize := sizeof(TWaveFormatExtensible)-sizeof(TWaveFormatEx); fmt.Samples.wValidBitsPerSample := cBitsPerSample; Mask := 0; if m_Channels >= 1 then Mask := Mask OR SPEAKER_FRONT_LEFT; if m_Channels >= 2 then Mask := Mask OR SPEAKER_FRONT_RIGHT; if m_Channels >= 3 then Mask := Mask OR SPEAKER_FRONT_CENTER; if m_Channels >= 4 then Mask := Mask OR SPEAKER_LOW_FREQUENCY; if m_Channels >= 5 then Mask := Mask OR SPEAKER_BACK_LEFT; if m_Channels >= 6 then Mask := Mask OR SPEAKER_BACK_RIGHT; if m_Channels >= 7 then Mask := Mask OR SPEAKER_SIDE_LEFT; if m_Channels >= 8 then Mask := Mask OR SPEAKER_SIDE_RIGHT; fmt.dwChannelMask := Mask; fmt.SubFormat := KSDATAFORMAT_SUBTYPE_PCM;
waveOutOpen(@m_WaveOut, aDevNum, PWaveFormatEx(@fmt), DWORD(@waveCallBack), Integer(Self), CALLBACK_FUNCTION); ... |
Vielleicht weiß ja jemand mehr...
