Ну да, кажется я тут нагородил...
Я же начинал переписывать систему воспроизведения звука.
Есть функция воспроизведения через прерывания - она возвращает управление сразу.
Код:
void playback_sound(TSOUND_ROLE sound_role)//воспроизводим звук через прерывание
{
if (curr_sound.simples_in_queue>1) //если звук уже воспроизводится
{
curr_sound.simples_in_queue=1;//закроем eeprom
while (eeprom_is_open);//дождемся, пока eerom закроется
}
switch (sound_role)
{
//звук выстрела
case shot_sound:
{
curr_sound.role = sound_role;
curr_sound.adress = eeprom_read_word(&sound_1_adress);
curr_sound.size = eeprom_read_word(&sound_1_size);
curr_sound.simples_in_queue = curr_sound.size;
curr_sound.play_now = true;
}
break;
//звук ранения
case hit_sound:
{
curr_sound.role = sound_role;
curr_sound.adress = eeprom_read_word(&sound_2_adress);
curr_sound.size = eeprom_read_word(&sound_2_size);
curr_sound.simples_in_queue = curr_sound.size;
curr_sound.play_now = true;
}
break;
//звук винимаемой обоймы
case clip_out_sound:
{
curr_sound.role = sound_role;
curr_sound.adress = eeprom_read_word(&sound_3_adress);
curr_sound.size = eeprom_read_word(&sound_3_size);
curr_sound.simples_in_queue = curr_sound.size;
curr_sound.play_now = true;
}
break;
//звук вставляемой обоймы
case clip_in_sound :
{
curr_sound.role = sound_role;
curr_sound.adress = eeprom_read_word(&sound_4_adress);
curr_sound.size = eeprom_read_word(&sound_4_size);
curr_sound.simples_in_queue = curr_sound.size;
curr_sound.play_now = true;
}
break;
//звук осечки
case misfire_sound:
{
curr_sound.role = sound_role;
curr_sound.adress = eeprom_read_word(&sound_5_adress);
curr_sound.size = eeprom_read_word(&sound_5_size);
curr_sound.simples_in_queue = curr_sound.size;
curr_sound.play_now = true;
}
break;
//звук "старт игры"
case start_game_sound:
{
curr_sound.role = sound_role;
curr_sound.adress = eeprom_read_word(&sound_6_adress);
curr_sound.size = eeprom_read_word(&sound_6_size);
curr_sound.simples_in_queue = curr_sound.size;
curr_sound.play_now = true;
}
break;
//звук "игра закончена"
case game_over_sound:
{
curr_sound.role = sound_role;
curr_sound.adress = eeprom_read_word(&sound_7_adress);
curr_sound.size = eeprom_read_word(&sound_7_size);
curr_sound.simples_in_queue = curr_sound.size;
curr_sound.play_now = true;
}
break;
//звук "пролетающей пули"
case flying_bullet_sound: simples_in_queue = eeprom_read_word(&sound_8_size);
{
curr_sound.role = sound_role;
curr_sound.adress = eeprom_read_word(&sound_8_adress);
curr_sound.size = eeprom_read_word(&sound_8_size);
curr_sound.simples_in_queue = curr_sound.size;
curr_sound.play_now = true;
}
break;
default:
{
curr_sound.role = nothing_to_play;
curr_sound.simples_in_queue = 0;
curr_sound.play_now = false;
}
break;
}
}
Звук ранения воспроизводится ей.
А есть функция, которая возвращает управление только после воспроизведения звука.
Звук "новая игра" вызывается ей.
Тут видимо и нестыковка.
Можно попробовать воспроизводить звук "новая игра" той же функцией, что и звук ранения.
Попробуйте вместо
Код:
playstartsound();
использовать
Код:
playback_sound(start_game_sound);
Это в файле ltag_ascetic.c
вот тут
Код:
case Command://êàêàÿ òî äîïîëíèòåëüíîÿ êîìàíäà
{
switch(ir_message.param)//âûÿñíèì, êàêàÿ ýòî êîìàíäâ
{
case 0x05://íà÷àòü íîâóþ èãðó íåìåäëåííî
{
if (simples_in_queue>1) //åñëè çâóê âûñòðëà âîñïðîèçâîäèòñÿ
{
simples_in_queue=1;//çàêðîåì eeprom
while (eeprom_is_open);//äîæäåìñÿ, ïîêà eerom çàêðîåòñÿ
}
init_var(); //èíèöèàëèçèðóåì ïåðåìåííûå
joystick_event=no_pressing; //î÷èùàåì ñîáûòèÿ äæîéñòèêà
keyboard_event=no_key_pressing;//î÷èùàåì ñîáûòèÿ òðèããåðà
reload_key_event=no_key_pressing;//î÷èùàåì ñîáûòèÿ ïåðåçàðÿäêè
rx_event = NOT_EVENT; //î÷èùàåì ñîáûòèÿ ÈÊ ïðèåìíèêà
display_status();//îáíîâëÿåì èíôîðìàöèþ íà äèñïëåå
display_life(life);//îòîáðàçèì óðîâåíü æèçíè íà äèîäàõ
WOUND_LED_ON;
playstartsound();
//êîä îáðàáîòêè äîïîëíèòåëüíîé êîìàíäû
WOUND_LED_OFF;