Allegro 5 中的原始音频播放
Raw audio playback in Allegro 5
我正在编写一个 MOD 播放器,尝试使用 Allegro5 原始流功能播放样本,但我无法找出流的确切初始化参数来播放来自 mod 文件.
这是我的:
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 参数被硬编码用于测试 (8363Hz),但是,以指定频率播放我没有得到我期望的结果,并且 al_drain_audio_stream() 永远卡在播放垃圾中在一个循环中...
如有任何帮助,我们将不胜感激。
至少,您需要在调用 al_set_audio_stream_fragment
之前调用 al_get_audio_stream_fragment
。通常,您会在 while 循环中提供这些流,同时响应 ALLEGRO_EVENT_AUDIO_STREAM_FRAGMENT
事件。有关示例代码,请参阅 Allegro 源代码中的 ex_saw
示例:https://github.com/liballeg/allegro5/blob/master/examples/ex_saw.c
我正在编写一个 MOD 播放器,尝试使用 Allegro5 原始流功能播放样本,但我无法找出流的确切初始化参数来播放来自 mod 文件.
这是我的:
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 参数被硬编码用于测试 (8363Hz),但是,以指定频率播放我没有得到我期望的结果,并且 al_drain_audio_stream() 永远卡在播放垃圾中在一个循环中...
如有任何帮助,我们将不胜感激。
至少,您需要在调用 al_set_audio_stream_fragment
之前调用 al_get_audio_stream_fragment
。通常,您会在 while 循环中提供这些流,同时响应 ALLEGRO_EVENT_AUDIO_STREAM_FRAGMENT
事件。有关示例代码,请参阅 Allegro 源代码中的 ex_saw
示例:https://github.com/liballeg/allegro5/blob/master/examples/ex_saw.c