Mario
Если собираешься делать кольцевой буфер посмотри исходники Doom s_sound.c.
Документация по Infinity
Спасибо! Попробую, если потоковый не справится.
Mario! Если не секрет, что Вы задумали ?
Каюс - невнимательно читал :
Цитата:"для воспроизведения отдельных семплов-букв (в синтезаторе речи) "
Каюс - невнимательно читал :
Цитата:"для воспроизведения отдельных семплов-букв (в синтезаторе речи) "
Я же маргинал и злодей, потому задумал очередное черное дело.
Вот это я понимаю !..
Обновил документацию на вики http://wiki.kolibrios.org/wiki/Sound/ru
Это был долгий вечер...
Следствием установлено:
1) В режиме PCM_RING нельзя инициализировать звуковую подсистему в одном потоке и вызывать воспроизведение в другом, даже если они в одном адресном пространстве и один является родителем для другого - ф.68.14 будет ждать очень долго...
2) В режиме PCM_RING не корректно воспроизводятся сэмплы с частотой ниже 44100, т.е. 22050 и ниже. Особенно сильно проявляется на 8 бит и 1 канал.
В режиме PCM_OUT такого сроду не было...
Следствием установлено:
1) В режиме PCM_RING нельзя инициализировать звуковую подсистему в одном потоке и вызывать воспроизведение в другом, даже если они в одном адресном пространстве и один является родителем для другого - ф.68.14 будет ждать очень долго...
Spoiler:
Spoiler:
Spoiler:
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Mario_r4
1. Это и к остальным типам относится. Буфер привязан к контексту потока. Использование в другом контексте не рекомендуется.
2.В Doom 11КГц стерео 16 бит выводится корректно. Скорее всего ты неправильно создаёшь буфер. Надо сразу указывать формат звука.
1. Это и к остальным типам относится. Буфер привязан к контексту потока. Использование в другом контексте не рекомендуется.
2.В Doom 11КГц стерео 16 бит выводится корректно. Скорее всего ты неправильно создаёшь буфер. Надо сразу указывать формат звука.
Зато 8 КГц моно выводится "трелью".Serge wrote:2.В Doom 11КГц стерео 16 бит выводится корректно. Скорее всего ты неправильно создаёшь буфер. Надо сразу указывать формат звука.
Укажи пожалуйста где я создаю неправильно буфер:
Spoiler:
Code: Select all
snd_background_music_thread_start:
mov eax,[background_music]
mov [wav_for_test],eax
mov ebx,eax
add ebx,1024
mov [wav_for_test_end],ebx
call initialize_sound_system
;--------------------------------------
.1:
cmp [music_flag],1
je .start
mcall 5,50
mcall 68,1
jmp snd_background_music_thread_start.1
;--------------------------------------
.start:
stdcall _PlayBuffer@8, [hBuff1], 0
cmp eax,-1
je snd_play_buffer_fail
; DEBUGF 1, "Play Buffer successful EAX: %x\n",eax
;--------------------------------------
.start_1:
mov eax,[background_music]
; check for correct data_offset
push eax
add eax,[data_offset]
sub eax,4
cmp [eax],dword 'data'
pop eax
je @f
mov [wav_for_test],eax
mov ebx,eax
add ebx,1024
mov [wav_for_test_end],ebx
call find_data_offset
cmp [sound_flag],0
jz snd_background_music_thread_start.1 ;.exit
;--------------------------------------
@@:
add eax,[data_offset]
mov ebx,[eax]
add eax,4
mov ebp,eax
add ebx,eax
; DEBUGF 1, "start EAX: %x\n",eax
;--------------------------------------
.loop:
cmp [music_flag],0
jne @f
stdcall _StopBuffer@4, [hBuff1]
; DEBUGF 1, "Stop Buffer EAX: %x\n",eax
jmp snd_background_music_thread_start.1
;--------------------------------------
@@:
; get event data from the driver
; DEBUGF 1, "Get driver_notify_struct \n"
push ebx
mcall 68,14,hBuff1_driver_notify_struct
pop ebx
; DEBUGF 1, "Check to code \n"
; проверка на code
cmp [hBuff1_driver_notify_struct], dword 0xFF000001
jne @b
; DEBUGF 1, "Check to stream \n"
; проверка на stream
mov eax,[hBuff1_driver_notify_struct+8]
cmp eax,[hBuff1]
jne @b
; DEBUGF 1, "Get buffer_offset \n"
; получить смещение в буффере
mov eax,[hBuff1_driver_notify_struct+12]
mov [hBuff1_buffer_offset],eax
; DEBUGF 1, "src EBP: %x size EBX: %x\n",ebp,ebx
stdcall _SetBuffer@16, [hBuff1], ebp, [hBuff1_buffer_offset], [hBuff1_buffer_size]
cmp eax,-1
je snd_set_buffer_fail
; DEBUGF 1, "Set Buffer successful EAX: %x\n",eax
; add ebp,8192*2
add ebp,[hBuff1_buffer_size]
add ebp,[hBuff1_buffer_size]
cmp ebx,ebp
jbe .start_1
; sub ebp,8192
sub ebp,[hBuff1_buffer_size]
jmp .loop
;------------------------------------------------------------------------------
initialize_sound_system:
mov [sound_flag],1
stdcall _InitSound@4,version
cmp eax,-1
je snd_init_fail
; DEBUGF 1, "Sound init successful %x\n",eax
mov eax,[version]
and eax,0xffff
cmp eax,SOUND_VERSION
jne snd_version_fail
; DEBUGF 1, "Sound version successful %x\n",eax
stdcall _test_wav@4,dword [wav_for_test] ;letter_1a
test eax,eax
jz snd_test_wav_fail
; or eax,PCM_OUT
or eax,PCM_RING
mov [snd_format],eax
; DEBUGF 1, "Test wav successful %x\n",eax
call find_data_offset
mov al,[sound_flag]
test al,al
jz .exit
;--------------------------------------
stdcall _CreateBuffer@12,[snd_format],0,hBuff1
cmp eax,-1
je snd_create_buffer_fail
; DEBUGF 1, "Create Buffer 1 successful %x\n",eax
stdcall _GetBufferSize@8,[hBuff1],hBuff1_buffer_size
cmp eax,-1
je snd_get_buffer_size_fail
; DEBUGF 1, "Get Buffer 1 size successful size: %x\n",[hBuff1_buffer_size]
mov ecx,[hBuff1_buffer_size]
shr ecx,1
mov [hBuff1_buffer_size],ecx
;--------------------------------------
.exit:
ret
;------------------------------------------------------------------------------
find_data_offset:
mov esi,[wav_for_test]
;--------------------------------------
@@:
cmp [esi],dword 'data'
je @f
inc esi
cmp esi,[wav_for_test_end]
jne @b
; DEBUGF 1, "find data offset fail\n"
mov [sound_flag],0
ret
;--------------------------------------
@@:
sub esi,[wav_for_test]
add esi,4
mov [data_offset],esi
ret
;------------------------------------------------------------------------------
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
На первый взгляд всё правильно. Одну ошибку в драйвере я исправил. Страдали 8-ми битные моно с частотой меньше 24КГц и 8-ми битные стерео с частотой меньше 12 КГц.
Ну, вот. Помнится FPLAY тоже был идеален, пока не был исправлен.
Спасибо за оперативный фикс.
Спасибо за оперативный фикс.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Who is online
Users browsing this forum: No registered users and 1 guest