Page 2 of 2

Re: Документация по Infinity

Posted: Tue Apr 24, 2012 4:12 pm
by Serge
Mario
Если собираешься делать кольцевой буфер посмотри исходники Doom s_sound.c.

Re: Документация по Infinity

Posted: Tue Apr 24, 2012 5:20 pm
by Mario
Спасибо! Попробую, если потоковый не справится.

Re: Документация по Infinity

Posted: Tue Apr 24, 2012 7:42 pm
by FireWall
Mario! Если не секрет, что Вы задумали ?

Каюс - невнимательно читал :( :

Цитата:"для воспроизведения отдельных семплов-букв (в синтезаторе речи) "

Re: Документация по Infinity

Posted: Tue Apr 24, 2012 8:15 pm
by Mario
Я же маргинал и злодей, потому задумал очередное черное дело.

Re: Документация по Infinity

Posted: Wed Apr 25, 2012 9:13 pm
by FireWall
Вот это я понимаю !.. :mrgreen:

Re: Документация по Infinity

Posted: Sat Jun 16, 2012 11:37 pm
by XVilka
Обновил документацию на вики http://wiki.kolibrios.org/wiki/Sound/ru

Re: Документация по Infinity

Posted: Sun Dec 28, 2014 4:50 am
by Mario_r4
Это был долгий вечер...

Следствием установлено:
1) В режиме PCM_RING нельзя инициализировать звуковую подсистему в одном потоке и вызывать воспроизведение в другом, даже если они в одном адресном пространстве и один является родителем для другого - ф.68.14 будет ждать очень долго...
Spoiler:Image
2) В режиме PCM_RING не корректно воспроизводятся сэмплы с частотой ниже 44100, т.е. 22050 и ниже. Особенно сильно проявляется на 8 бит и 1 канал.
Spoiler:Image
В режиме PCM_OUT такого сроду не было...
Spoiler:Image

Re: Документация по Infinity

Posted: Sun Dec 28, 2014 7:49 am
by Serge
Mario_r4
1. Это и к остальным типам относится. Буфер привязан к контексту потока. Использование в другом контексте не рекомендуется.
2.В Doom 11КГц стерео 16 бит выводится корректно. Скорее всего ты неправильно создаёшь буфер. Надо сразу указывать формат звука.

Re: Документация по Infinity

Posted: Sun Dec 28, 2014 10:08 am
by Mario_r4
Serge wrote:2.В Doom 11КГц стерео 16 бит выводится корректно. Скорее всего ты неправильно создаёшь буфер. Надо сразу указывать формат звука.
Зато 8 КГц моно выводится "трелью".

Укажи пожалуйста где я создаю неправильно буфер:
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
;------------------------------------------------------------------------------

Re: Документация по Infinity

Posted: Sun Dec 28, 2014 3:57 pm
by Serge
На первый взгляд всё правильно. Одну ошибку в драйвере я исправил. Страдали 8-ми битные моно с частотой меньше 24КГц и 8-ми битные стерео с частотой меньше 12 КГц.

Re: Документация по Infinity

Posted: Sun Dec 28, 2014 4:48 pm
by Mario_r4
Ну, вот. Помнится FPLAY тоже был идеален, пока не был исправлен. :wink:
Спасибо за оперативный фикс.