Как заполнить буфер в DirectSound?

Тема в разделе "Библиотеки и интерфейсы", создана пользователем Jaman, 9 авг 2005.

  1. Jaman

    Jaman New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2004
    Сообщения:
    15
    Код (Text):
    1.  
    2.    .DATA?
    3.     pDSSample       DirectSoundBuffer8
    4.     dsbdesc_        DSBUFFERDESC
    5.     wfx_            WAVEFORMATEX          ;как заполнить эту структуру?
    6.     S_data          dd  ?
    7.     S_lengte        dd  ?
    8.    .END
    9.    mov     [dsbdesc_.dwSize], sizeof.DSBUFFERDESC
    10.    mov     [dsbdesc_.dwFlags], DSBCAPS_GLOBALFOCUS
    11.    mov     [dsbdesc_.dwBufferBytes], 241686
    12.    mov  DWORD [wfx_.nSamplesPerSec],8000
    13.    mov   WORD [wfx_.wBitsPerSample],8
    14.    mov  WORD [wfx_.nChannels],1
    15.    lea     eax,[wfx_]
    16.    mov     [dsbdesc_.lpwfxFormat], eax
    17.    comcall pDirectSound, CreateSoundBuffer, dsbdesc_, pDSSample, 0
    18.    test    eax, eax
    19.    jz      @F
    20.    invoke  MessageBox,[hwnd],szCreateDSB, szAppName,MB_ICONEXCLAMATION                ;происходит ошибка
    21. @@:                                                            
     
  2. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Код (Text):
    1.  
    2. ...
    3. .data?
    4. wfrt WAVEFORMATEX <?>
    5. db 1024 dup (?) ;дополнительная информация
    6. ...
    7. .code
    8. ...
    9.  mov [wfrt.wFormatTag], WAVE_FORMAT_PCM
    10.  mov [wfrt.cbSize], 0
    11.  mov [wfrt.nChannels], 1
    12.  mov [wfrt.nSamplesPerSec], 8000         ;8000-44100
    13.  mov [wfrt.wBitsPerSample], 8            ;16
    14.  xor eax, eax
    15.  xor ecx, ecx
    16.  mov ax, [wfrt.nChannels]
    17.  mov cx, [wfrt.wBitsPerSample]
    18.  m_mult eax, ecx
    19.  shr eax, 3
    20.  mov [wfrt.nBlockAlign], ax              ;nChannels*wBitsPerSample/8
    21.  m_mult eax, [wfrt.nSamplesPerSec]
    22.  mov [wfrt.nAvgBytesPerSec], eax         ;nSamplesPerSec*nBlockAlign
    23. ...
    24.  
     
  3. Jaman

    Jaman New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2004
    Сообщения:
    15
    Спасибо. С WAVEFORMATEX вроде разобрался, буфер создается.

    Дальше хочу в буфер запихнуть массив звуковых данных и сделать это в цикле.

    Возможно ли это сделать после вызова
    Код (Text):
    1. comcall pDSSample, Lock1, 0, [ChunkInfo.ckSize], S_data, S_lengte, 0, 0, 0  


    Он вроде бы возвращает указатели на буфер и его размер, но у меня записать туда числа не получаеться.

    Помогите с адресацией!
     
  4. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    не знаю, с SDirectSound не работал.

    По обычному используй waveInGetNumDevs+waveInGetDevCaps,

    waveInOpen+waveInPrepareHeader, waveInAddBuffer+waveInStart, waveInReset+waveInClose+waveInUnprepareHeader
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    По поводу WAVEFORMATEX - нет смысла вычислять во время выполнения значения, которые известны в compile-time. См. код в аттаче (к сожалению, на С++). Там много лишнего, инициализация интерфейса (и соотв. WAVEFORMATEX) в AY_emulator::AY_emulator(). Воспроизведение лучше всего (рекомендуемый MS путь) синхронизировать на событиях используя интерфейс IDirectSoundNotify, все остальные способы (включая winmm) будут иметь проблемы из-за свопинга, положения звёзд и т.п. Пример как это делать - AY_emulator::play_chunk().



    По поводу проблем с Lock - слишком мало инфы. лучше всего взять за правило анализировать возвращаемые всеми методами значения и использовать обработчики исключений. Это много времени съкономит :derisive:

    [​IMG] 490999680__ay.rar