Page 2 of 6

Re: AC97snd - плеер MP3 и WAV

Posted: Tue Nov 09, 2010 9:18 pm
by Mario
Это уже к Serge. Зайдет на форум - чего-нибудь отпишет.

Re: AC97snd - плеер MP3 и WAV

Posted: Tue Nov 09, 2010 9:41 pm
by Serge
Вылетает здесь.

Code: Select all

Infinity.asm
proc set_vol_param stdcall, l_vol:dword,r_vol:dword,pan:dword
           locals
             _600    dd ?
             _32767  dd ?
             state   rb 108
           endl

           mov [_600], 0x44160000   ;600.0
           mov [_32767], 32767

           lea ebx, [state]
           fnsave [ebx]

           movq mm0, qword [l_vol]
           pminsw mm0, qword [vol_max] <<< SSE
           pmaxsw mm0, qword [vol_min] <<< SSE
           movq qword [l_vol], mm0
           movq qword [edx+STREAM.l_vol], mm0
Уровни громкости и баланс каналов приводятся к диапазону 0,-10000.

Re: AC97snd - плеер MP3 и WAV

Posted: Tue Nov 09, 2010 9:53 pm
by Unduing
Я думал об общем количестве вылетов, если их немного, получится их обойти?
В какой строке вылетает?
Вылетает где то в фрагменте?
Это первый вылет?
Их будет ещё много?

Re: AC97snd - плеер MP3 и WAV

Posted: Tue Nov 09, 2010 10:15 pm
by Serge
Это код регулировки громкости. Будет вылетать при первом вызове SND_SETVOLUME. Конткетно - здесь pminsw mm0, qword [vol_max]. Обойти не получится, только переписать.

Re: AC97snd - плеер MP3 и WAV

Posted: Tue Nov 09, 2010 10:23 pm
by Unduing
Сейчас читаю.
PMINSW compares each pair of words in the two source operands, and for each pair it stores the minimum value in the destination register.
Как я понимаю сравнивает два упакованных слова.
Т.е. если написать проверку на поддержку команд PMINSW, PMAXSW и заглушку для их замены должно заработать?
Как думаешь насколько строк потянут заглушки?
Дальше исключений не будет?

Re: AC97snd - плеер MP3 и WAV

Posted: Tue Nov 09, 2010 10:59 pm
by Serge
Будет работать. Что требуется:

Code: Select all

    if(l_vol > 0)
        l_vol = 0;
    else if(l_vol < -10000)
        l_vol = -10000;

    if(r_vol > 0)
        r_vol = 0;
    else if(r_vol < -10000)
        r_vol = -10000;

    if(pan > 10000)
        pan = 10000;
    else if( pan < -10000)
        pan = -10000;

    stream->pan = pan;

    if( pan > 0)
    {
        l_vol-= pan;
        if(l_vol < -10000)
            l_vol = -10000;
    }
    else
    {
        r_vol+= pan;
        if(r_vol < -10000)
            r_vol = -10000;
    }

calc_amp:
далее по-тексту

Re: AC97snd - плеер MP3 и WAV

Posted: Tue Nov 09, 2010 11:15 pm
by Unduing
Спасибо попробую заменить и запустить.

Re: AC97snd - плеер MP3 и WAV

Posted: Thu Nov 18, 2010 3:02 pm
by Unduing
Сделал замену, но останавливается в начале проигрывания файла без ошибок в доске отладки.
Точнее ac97snd открывается начинает идти ползунок и останавливается с небольшим смещением от начала, при этом никаких звуков нет.
Если после этого нажать stop, а потом play картина повторяется.

Re: AC97snd - плеер MP3 и WAV

Posted: Fri Nov 19, 2010 11:25 am
by Asper
Не срабатывает IRQ. Поставь отладочное сообщение в обработчике. Каждый раз по завершении обработки буфера должно генерироваться прерывание.

Re: AC97snd - плеер MP3 и WAV

Posted: Fri Nov 19, 2010 12:06 pm
by Unduing
Подскажи точнее где ставить?
В каком файле?
В каком месте?

Re: AC97snd - плеер MP3 и WAV

Posted: Fri Nov 19, 2010 12:37 pm
by Asper
В аудиодрайвере, в данном случае sb16.asm (так он вроде бы называется). В обработчике прерываний (в начале например) ставишь что-то вроде:

Code: Select all

mov    esi, strIRQ
call     SysMsgBoardStr
После вызова Рlay драйвера на доске отладке должна появиться автоматная очередь соответствующих сообщений.

Re: AC97snd - плеер MP3 и WAV

Posted: Sat Nov 20, 2010 11:17 pm
by Unduing
Поставил отладочное сообщение в infinity.asm
@@:
cmp eax, SND_OUT
jne @F
if DEBUG
mov esi, msgSNDOUT
call SysMsgBoardStr
end if

mov eax, [ebx+4]
stdcall wave_out, edx,eax,[ebx+8]
ret
под эмулятором в самом деле очередь сообщений по выводу звука, а в реальной машине где то 20 шт. и конец
и ещё подметил в конце отладки в эмуляторе строка о закрытии программы а в реальной отладке такой строки нет.

Re: AC97snd - плеер MP3 и WAV

Posted: Mon Nov 22, 2010 1:48 pm
by Asper
Вообще-то под обработчиком прерываний я имел ввиду вот эту функцию.
Ну да ладно всё равно понятно, что прерывание не срабатывает как надо, а это скорее всего следствие неправильной его обработки. Т.е. вероятно, что обработчик как следует не оповещает устройство об окончании обработки прерывания.

Re: AC97snd - плеер MP3 и WAV

Posted: Mon Nov 22, 2010 2:58 pm
by Asper
Unduing
Во-первых проверь правильно ли определился базовый порт (sb_base_port).
Во-вторых у тебя вроде бы Vibra16? Если так то ALSA тебе в помощь (путь alsa-driver-x.x.x\alsa-kernel\isa\sb).
Там в модуле sb16_main.c обработчик выглядит так:

Code: Select all

irqreturn_t snd_sb16dsp_interrupt(int irq, void *dev_id)
{
	struct snd_sb *chip = dev_id;
	unsigned char status;
	int ok;

	spin_lock(&chip->mixer_lock);
	status = snd_sbmixer_read(chip, SB_DSP4_IRQSTATUS);
	spin_unlock(&chip->mixer_lock);
	if ((status & SB_IRQTYPE_MPUIN) && chip->rmidi_callback)
		chip->rmidi_callback(irq, chip->rmidi->private_data);
	if (status & SB_IRQTYPE_8BIT) {
		ok = 0;
		if (chip->mode & SB_MODE_PLAYBACK_8) {
			snd_pcm_period_elapsed(chip->playback_substream);
			snd_sb16_csp_update(chip);
			ok++;
		}
		if (chip->mode & SB_MODE_CAPTURE_8) {
			snd_pcm_period_elapsed(chip->capture_substream);
			ok++;
		}
		spin_lock(&chip->reg_lock);
		if (!ok)
			snd_sbdsp_command(chip, SB_DSP_DMA8_OFF);
		snd_sb_ack_8bit(chip);
		spin_unlock(&chip->reg_lock);
	}
	if (status & SB_IRQTYPE_16BIT) {
		ok = 0;
		if (chip->mode & SB_MODE_PLAYBACK_16) {
			snd_pcm_period_elapsed(chip->playback_substream);
			snd_sb16_csp_update(chip);
			ok++;
		}
		if (chip->mode & SB_MODE_CAPTURE_16) {
			snd_pcm_period_elapsed(chip->capture_substream);
			ok++;
		}
		spin_lock(&chip->reg_lock);
		if (!ok)
			snd_sbdsp_command(chip, SB_DSP_DMA16_OFF);
		snd_sb_ack_16bit(chip);
		spin_unlock(&chip->reg_lock);
	}
	return IRQ_HANDLED;
}
В зависимости от переменной status прерывание может быть 8-ми или 16-ти битным.

Статус читается вот этой процедурой из модуля sb_mixer.c:

Code: Select all

unsigned char snd_sbmixer_read(struct snd_sb *chip, unsigned char reg)
{
	unsigned char result;

	outb(reg, SBP(chip, MIXER_ADDR));
	udelay(10);
	result = inb(SBP(chip, MIXER_DATA));
	udelay(10);
#ifdef IO_DEBUG
	snd_printk(KERN_DEBUG "mixer_read 0x%x 0x%x\n", reg, result);
#endif
	return result;
}
В sb.h можно найти процедуры snd_sb_ack_8bit и snd_sb_ack_16bit.

Code: Select all

static inline void snd_sb_ack_8bit(struct snd_sb *chip)
 {
    inb(SBP(chip, DATA_AVAIL));
 }

static inline void snd_sb_ack_16bit(struct snd_sb *chip)
 {
    inb(SBP(chip, DATA_AVAIL_16));
 }
В текущем обработчике прерываний драйвера для sb16 есть реализация только snd_sb_ack_16bit, вот она

Code: Select all

225 	   mov	edx,[sb_base_port] ;tell the DSP that we have processed IRQ
226 	   add	dl,0xF		   ;0xF for 16 bit sound, 0xE for 8 bit sound
227 	   in	al,dx		   ;for non-stop sound

Статус не проверяется, может быть и в этом проблема, может и не в этом нужно проверить.
Если базовый порт всё-таки определяется верно, попробуй добавить к обработчику чтение статуса:

Code: Select all

 	   mov	edx,[sb_base_port] 
 	   add	dl,0xF		   
 	   mov	al, 0x4
 	   out	dx,al
 	   inc	dl
 	   mov	eax, 10000 ; wait 10 ms
 	   call	StallExec
 	   in	al,dx		   
 	   push	eax
 	   mov	eax, 10000 ; wait 10 ms
 	   call	StallExec
 	   pop	eax
и обработку 8 битного прерывания:

Code: Select all

 	   mov	edx,[sb_base_port] ;tell the DSP that we have processed IRQ
 	   add	dl,0xE		   ;0xF for 16 bit sound, 0xE for 8 bit sound
 	   in	al,dx		   ;for non-stop sound


StallExec можно взять здесь.

Да и ещё наверное лучше будет сообщать о завершении обработки прерывания в конце, а не в начале обработчика.

Re: AC97snd - плеер MP3 и WAV

Posted: Tue Nov 23, 2010 12:21 am
by Unduing
Asper
Спасибо за подробный ответ.

Ты был прав поставил отладочное сообщение в sb16.asm в самом начале sb_irq, нет не одного входа в обработчик, не знаю почему.

1. Порт определился правильно.
2. Да у меня Vibra 16 вставленная в isa slot
Логи запуска

С предыдущим постом ещё разбираюсь.