Код (Text): .DATA? pDSSample DirectSoundBuffer8 dsbdesc_ DSBUFFERDESC wfx_ WAVEFORMATEX ;как заполнить эту структуру? S_data dd ? S_lengte dd ? .END mov [dsbdesc_.dwSize], sizeof.DSBUFFERDESC mov [dsbdesc_.dwFlags], DSBCAPS_GLOBALFOCUS mov [dsbdesc_.dwBufferBytes], 241686 mov DWORD [wfx_.nSamplesPerSec],8000 mov WORD [wfx_.wBitsPerSample],8 mov WORD [wfx_.nChannels],1 lea eax,[wfx_] mov [dsbdesc_.lpwfxFormat], eax comcall pDirectSound, CreateSoundBuffer, dsbdesc_, pDSSample, 0 test eax, eax jz @F invoke MessageBox,[hwnd],szCreateDSB, szAppName,MB_ICONEXCLAMATION ;происходит ошибка @@:
Код (Text): ... .data? wfrt WAVEFORMATEX <?> db 1024 dup (?) ;дополнительная информация ... .code ... mov [wfrt.wFormatTag], WAVE_FORMAT_PCM mov [wfrt.cbSize], 0 mov [wfrt.nChannels], 1 mov [wfrt.nSamplesPerSec], 8000 ;8000-44100 mov [wfrt.wBitsPerSample], 8 ;16 xor eax, eax xor ecx, ecx mov ax, [wfrt.nChannels] mov cx, [wfrt.wBitsPerSample] m_mult eax, ecx shr eax, 3 mov [wfrt.nBlockAlign], ax ;nChannels*wBitsPerSample/8 m_mult eax, [wfrt.nSamplesPerSec] mov [wfrt.nAvgBytesPerSec], eax ;nSamplesPerSec*nBlockAlign ...
Спасибо. С WAVEFORMATEX вроде разобрался, буфер создается. Дальше хочу в буфер запихнуть массив звуковых данных и сделать это в цикле. Возможно ли это сделать после вызова Код (Text): comcall pDSSample, Lock1, 0, [ChunkInfo.ckSize], S_data, S_lengte, 0, 0, 0 Он вроде бы возвращает указатели на буфер и его размер, но у меня записать туда числа не получаеться. Помогите с адресацией!
не знаю, с SDirectSound не работал. По обычному используй waveInGetNumDevs+waveInGetDevCaps, waveInOpen+waveInPrepareHeader, waveInAddBuffer+waveInStart, waveInReset+waveInClose+waveInUnprepareHeader
По поводу WAVEFORMATEX - нет смысла вычислять во время выполнения значения, которые известны в compile-time. См. код в аттаче (к сожалению, на С++). Там много лишнего, инициализация интерфейса (и соотв. WAVEFORMATEX) в AY_emulator::AY_emulator(). Воспроизведение лучше всего (рекомендуемый MS путь) синхронизировать на событиях используя интерфейс IDirectSoundNotify, все остальные способы (включая winmm) будут иметь проблемы из-за свопинга, положения звёзд и т.п. Пример как это делать - AY_emulator::play_chunk(). По поводу проблем с Lock - слишком мало инфы. лучше всего взять за правило анализировать возвращаемые всеми методами значения и использовать обработчики исключений. Это много времени съкономит 490999680__ay.rar