Воспроизведение необработанного звука в Allegro 5

Я пишу проигрыватель MOD, пытаясь воспроизвести образец с использованием возможностей необработанного потока Allegro5, я не могу определить точные параметры инициализации для потока для воспроизведения загруженных данных образца из файла мода.

Вот что у меня есть:

xf::ModLoader ml;
ml.loadFromFile("C:\\Users\\bubu\\Downloads\\agress.mod");
// getSampleLength() returns # of data words
int sample_length = ml.getSampleLength(1) * 2;
const int8_t* sample_data = ml.getSampleData(1);

ALLEGRO_MIXER* mixer = al_get_default_mixer();
ALLEGRO_AUDIO_STREAM* stream = al_create_audio_stream(1, sample_length, 8363, ALLEGRO_AUDIO_DEPTH_INT8, ALLEGRO_CHANNEL_CONF_1);

al_attach_audio_stream_to_mixer(stream, mixer);
al_set_audio_stream_gain(stream, 0.7f);
al_set_audio_stream_playmode(stream, ALLEGRO_PLAYMODE_ONCE);
al_set_audio_stream_playing(stream, true);
al_set_audio_stream_fragment(stream, (void*)sample_data);
al_drain_audio_stream(stream);

Во-первых, параметр freq жестко запрограммирован для теста (8363 Гц), но при воспроизведении на указанной частоте я не получаю ожидаемого результата, а al_drain_audio_stream() навсегда зависает, проигрывая мусор в цикле...

Любая помощь будет оценена по достоинству.


person NapardBlose    schedule 12.08.2016    source источник


Ответы (1)


По крайней мере, вам нужно позвонить al_get_audio_stream_fragment, прежде чем звонить al_set_audio_stream_fragment. Обычно вы передаете эти потоки в цикле while, отвечая на событие ALLEGRO_EVENT_AUDIO_STREAM_FRAGMENT. См. пример ex_saw в исходном коде Allegro для примера кода: https://github.com/liballeg/allegro5/blob/master/examples/ex_saw.c

person SiegeLord    schedule 15.08.2016