Задержки в звуке winmm

Тема в разделе "WASM.AUDIO", создана пользователем _qwe8013, 15 июл 2017.

  1. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    123
    В общем решил создать отдельную тему, хотя вопрос из той темы всё ещё актуален. В общем вывожу белый шум средствами winmm (waveOutOpen, waveOutWrite, и т.д.), но проблема в том, что когда заканчивается воспроизведение одного буфера возникает короткая, но очень хорошо слышимая задержка. Увеличение размера буфера от неё не избавляет, как от этой гадости избавиться?
    Код (ASM):
    1. jmp .cmp
    2.     .Loop:
    3.    
    4.        
    5.         invoke WaitForSingleObject,[Event],-1
    6.        
    7.         fastcall GenSound,[rsi+WAVEHDR.lpData],[BufSize]
    8.        
    9.         invoke waveOutWrite,[WaveHandle],rsi,sizeof.WAVEHDR
    10.        
    11.         xchg rsi,rdi
    12.        
    13.    
    14.     .cmp:
    15.     lock and dword [rbx],1
    16.     je .Loop
    PS
    Звук - mono 16 бит.
     
  2. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    123
    Поменял расположение вызова WaitForSingleObject и всё стало нормально, странно...
    Код (ASM):
    1. jmp .cmp
    2.     .Loop:
    3.    
    4.        
    5.         fastcall GenSound,[rsi+WAVEHDR.lpData],[BufSize]
    6.        
    7.         invoke waveOutWrite,[WaveHandle],rsi,sizeof.WAVEHDR
    8.        
    9.         invoke WaitForSingleObject,[Event],-1
    10.        
    11.         xchg rsi,rdi
    12.        
    13.    
    14.     .cmp:
    15.     lock and dword [rbx],1
    16.     je .Loop
     
  3. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    _qwe8013, нужно заполнять сразу 2 буфера при первом запуске, потом уже когда один проигрался - заполнять его, пока второй играется.
     
  4. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    123
    Thetrik, Так в #1 так и делается, а в #2 - он ждёт пока буфер проиграется, а потом заполняет другой.