数字采样声音例程



SAMPLE *load_sample(char *filename);
从文件读入一个采样声音, 返回它的指针, 如果出错则返回 NULL. 提供的这个函数支持单声道和立体声的 WAV 和单声道的 VOC 文件, 可以是 8 或 16 位格式的.

SAMPLE *load_wav(char *filename);
从一个 RIFF WAV 文件里读入一个采样声音.

SAMPLE *load_voc(char *filename);
从一个 Creative Labs VOC 文件中读入一个采样声音.

SAMPLE *create_sample(int bits, int stereo, int freq, int len);
建造一个新的指定类型的采样声音结构. 数据域指针指向波形格式的数据块: 见 allegro.h 里的结构定义的描述.


void destroy_sample(SAMPLE *spl);
当你调用了这个,就撤销掉了一个采样声音结构. 即使是在采样声音正在播放时调用也是安全的, 因为它会检查声音, 如果正在播放则会先关掉它.

int play_sample(SAMPLE *spl, int vol, int pan, int freq, int loop);
以指定音量, 左右声道 (pan) 位置, 和频率开启一个采样声音. 音量和左右声道位置 (pan) 的范围是从 0 (小/左) 到 255 (大/右). 频率是相对的而不是绝对的: 1000 表示录制采样声音时的频率, 2000 是它的两倍, 等等. 如果循环标志被设置了, 采样声音将不停的重复知道你调用 stop_sample(), 它可以在你播放时通过调用 adjust_sample() 来调整.

void adjust_sample(SAMPLE *spl, int vol, int pan, int freq, int loop);
当采样声音在播放时改变参数 (用来控制循环播放的声音). 你可以改变音量, 左右声道位置, 和频率, 也可以清除循环标志, 这样可以在到达这次循环的末尾停止. 如果有几个相同的采样声音在播放, 这调整第一个碰上的. 如果采样声音没有在播放,它不起效果.

void stop_sample(SAMPLE *spl);
杀掉一个采样声音, 这在你设置了循环模式的采样声音时需要. 如果有几个采样声音在播放, 它将停掉所有的.



如果你需要更详细的描述来控制采样声音怎样播放, 你可以使用 更低层次的音效函数而不是调用 play_sample(). 这有更多的工作要做, 因为你必须明确的分配和释放音效 而不是等它们结束播放时自动的被触发, 但是它允许你非常细致的准确指定你想对声音干的每件事. 你还可能想修改采样声音结构的区域:


   int priority;
      范围 0-255 (缺省 128), 如果你试图播放比驱动程序能管理更多的音效,
      这控制着音效怎样被分配. 这可以用在保证
      在重要的声音被维持而次要的声音被砍掉.


unsigned long loop_start; unsigned long loop_end; 采样声音联合的循环位置, 缺省设置为采样声音的开始和结束处.


int allocate_voice(SAMPLE *spl);
分配一声卡音效准备播放指定了采样声音, 设置合理的缺省值 (最大的音量, 左右声道居中, 不改变音调, 不循环). 当你播放完了 必须调用 deallocate_voice() 或 release_voice() 释放它. 返回音效数, 当没有音效可利用则返回 -1.

void deallocate_voice(int voice);
释放一声卡音效, 无论是使用什么资源都将停止播放和发布.


void reallocate_voice(int voice, SAMPLE *spl);
切换一个正在分配的音效来使用不同的采样声音. 调用 reallocate_voice(voice, sample) 相当于:

      deallocate_voice(voice);
      voice = allocate_voice(sample);

void release_voice(int voice);
发布一个声卡音效, 就是说你对控制它不再感兴趣了. 声音将继续播放, 它使用的任何资源将在放完后自动的停止.

这本质上和 deallocate_voice() 相同, 但是它在生效前将等待声音停止.


void voice_start(int voice);
开启一个音效, 使用已经设置好的参数.

void voice_stop(int voice);
停止一个音效, 储存当前的位置和状态以便于以后调用 voice_start() 接着放.


void voice_set_priority(int voice, int priority);
设置音效的优先级 (范围 0-255). 如果你试图播放比声卡驱动程序能够管理的更多的音效, 这用来决定哪个音效应当被砍掉.

SAMPLE *voice_check(int voice);
检查音效当前是否被分配了. 它返回音效正在使用的采样声音的一个拷贝, 如果音效非活动的则返回 NULL (即音效已经被取消分配, 或 release_vioce() 函数被调用且 采样声音已经停止播放了).

int voice_get_position(int voice);
以采样声音联合的形似返回当前音效的位置, 如果停止播放了则返回 -1.


void voice_set_position(int voice, int position);
以采样声音联合的形式设置音效的位置.

void voice_set_playmode(int voice, int playmode);
调整指定音效的循环状态. 当音效正在播放时这也可以完成, 因此你可以以循环模式开始一个采样声音 (设置循环开始和结束位置为合适的值), 然后当你想结束声音时清除循环标志, 它将播放附随的采样声音部分持续到循环尾, 以正常的方式结束. 模式参数是一个包含以下值的位域:


int voice_get_volume(int voice);
返回当前的音效音量, 返回 0-255.

void voice_set_volume(int voice, int volume);
设置音效的音量, 范围 0-255.

void voice_ramp_volume(int voice, int time, int endvol);
开始从当前音量到指定结束音量的渐变(渐强或渐弱)操作, 时间以百万分之一秒为单位.

void voice_stop_volumeramp(int voice);
中断音量渐变操作.

int voice_get_frequency(int voice);
返回当前音效的音调, 以 Hz 为单位.

void voice_set_frequency(int voice, int frequency);
设置音效的音调, 以 Hz 为单位.

void voice_sweep_frequency(int voice, int time, int endfreq);
开始从当前位置的音调到指定位置结束音调的频率移动 (glissando) , 时间以百万分之一秒为单位.

void voice_stop_frequency_sweep(int voice);
中断频率移动操作.

int voice_get_pan(int voice);
返回当前的 pan 位置, 从 0(左) 到 255 (右).

void voice_set_pan(int voice, int pan);
甚至 pan 位置, 范围从 0 (左) 到 255 (右).

void voice_sweep_pan(int voice, int time, int endpan);
开始从当前位置到指定结束位置的 pan sweep ( 左 <-> 右移动) 操作, 时间以百万分之一秒为单位.

void voice_stop_pan_sweep(int voice);
中断 pan sweep (左右声道移动) 操作.

void voice_set_echo(int voice, int strength, int delay);
设置音效的回声参数 (现在还没有提供).

void voice_set_tremolo(int voice, int rate, int depth);
设置音效的震音参数 (现在还没有提供).

void voice_set_vibrato(int voice, int rate, int depth);
设置音效的颤音参数 (现在还没有提供).




返回