Allegro 中可变的部分, 例如声音例程和 load_joystick_data() 函数, 需要一些设置信息. 这些数据被储存在一个文本文件的 '变量=值' 这样的行中, 注解被写在以 '#' 开头的行,直到行末. 设置文件可以被任意的分成几个部分(section), 每个部分以 "[这部分的名字]" 这样一行开始. 每部分有唯一的名字空间, 这样是避免名字的冲突, 但是只要不在同一部分, 每个变量都可以同时出现在所有的部分了.
缺省时设置数据是从一个叫 allegro.cfg 或 sound.cfg 的文件里读入的,这个文件将
在和程序所处的目录下寻找, 或者放在 ALLEGRO 环境变量指向的目录里. 如果你不喜
欢这种方式,你可以指定任何一个你喜欢的文件名,或者使用你自己程序规定的一块二
进制设置数据 (比如可以从数据文件里载入).
你可以在设置文件里储存你喜欢的任何配置信息, 就象 Allegro 使用的基本变量那样
(见后面).
void set_config_file(char *filename);
设置设置文件名,以被附随的所有设置函数使用. 如果你没有调用这个函数, Allegro
将使用缺省的 allegro.cfg 这个文件,首先在和执行程序所在的目录下寻找, 然后在
ALLEGRO 环境变量指向的目录下寻找.
void set_config_data(char *data, int length);
指定一个已经被载入内存的数据块来被所有的附随设置函数使用, (可以是一个你自
己的复杂数据类型,或者从 grabber 数据文件里载入的数据). 这个例程将信息作了
备份,所以你在调用它后可以安全的释放掉数据占的内存.
void override_config_file(char *filename);
指定一个包含了优先设置的文件名,这些设置将被用在主设置文件的参数附加信息上,
当一个变量在两个文件中均被提及,则这个版本中的变量将被优先采用. 这些可以被应用程序的程序员在他们的代码中优先使用一些设置, 然后依旧将主设置文件留给用户配置. 例如, 你可以指定一个特别的样本频率和 IBK 乐器(instrument)文件, 但是用户还是可以用 sound.cfg 或 allegro.cfg 文件来指定端口设置和 IRQ 数值.
void override_config_data(char *data, int length);
override_config_file() 的使用内存数据块版本.
void push_config_state();
将当前的设置状态(文件名,变量值,等)压入一个内部栈,使你可以选择其它的设置,
然后可以调用 pop_config_state() 来恢复当前的设置. 这个函数是被设计成其它
库函数内部使用的, 比如当你为 save_joystick_data() 指定一个设置文件名,
它在切换到你指定的文件前就将设置状态压栈.
void pop_config_state();
将前面用 push_config_state() 储存的设置状态弹出, 用它来替换掉当前的设置.
void hook_config_section(char *section,
int (*intgetter)(char *name, int def),
char *(*stringgetter)(char *name, char *def),
void (*stringsetter)(char *name, char *value));
取得指定设置文件段的控制,
这样你的钩子函数将用来取代正常的磁盘文件控制来操纵它.
如果 getter 和 setter 函数都是 NULL,
当前的钩子就拖钩了. 钩子函数有最高的优先权.
如果一个段被钩住, 钩子总是被调用的,
因此你也可以钩住一个 '#' 段: 甚至 override_config_file() 也不能越权于
一个被钩住的段.
int config_is_hooked(char *section);
如果指定的段被钩住,返回 TRUE.
char *get_config_string(char *section, char *name, char *def);
从当前的设置文件里得到一个字符串.如果变量名没有被找到,则返回缺省值.
section 名可以被设为 NULL 来从任意的部分中寻找值,或者用来控制你感兴趣的
参数集合 (例如 sound 或 joystick).
int get_config_int(char *section, char *name, int def);
从当前的设置文件里读一个整数值.见 get_config_string() 的注解.
int get_config_hex(char *section, char *name, int def);
以十六进制读取当前设置文件里的一个整数值. 见 get_config_string() 的注解.
float get_config_float(char *section, char *name, float def);
从当前设置文件里读取一个浮点值.见 get_config_string() 的注解.
int get_config_id(char *section, char *name, int def);
从当前的设置文件里读一个 3 字符长的驱动器的 ID 变量.
见 get_config_string() 的注释.
char **get_config_argv(char *section, char *name, int *argc);
从当前设置文件里读取一个标记列表 (用空格分开的单词), 返回一个 argv 类型
的列表, 将 argc 设置为标记的个数 (不象 argc.argv, 这个表是从 0 开始的).
如果变量没有提供,返回 NULL 并将 argc 设为 0. 标记列表被储存在一个临时缓
冲区,数据将被下次调用 get_config_argv() 撤销, 所以数据不会长期保留.
char *get_config_text(char *msg);
这个函数主要设计为库代码内部使用,
但是也可能对程序员有用.
它使用 language.dat 文件来查找当前选择的语言的参数译文,
如果能找到,则返回一个适当的译文,如果不能则返回参数的复制.
这个和在 [language] 段调用 get_config_string() 是一样的, msg是变量名, msg 是缺省值.
void set_config_string(char *section, char *name, char *val);
向当前的设置文件写一个字符串数据,覆盖掉原来的任何可能存在的数据,如果
val 是 NULL 的话则移去这个变量. section 名字可以为空,
以用来将数据写在文件的根部分,
或者用来控制有这个变量的 section.
这个将被改变的文件将放在内存缓冲,
直到你调用 allegro_exit() 才真正写入磁盘. 注意,用这个方法你只能写
文件, 所以如果当前设置源是被 set_config_data() 指定的话,
而不是用 set_config_file() 指定的话,函数将不起效果.
一个特别的情况, 以 '#' 开头的变量或段落名 将被特殊对待, 也不将读取或写到磁盘. 附加包可以使用这个来储存版本信息或其它状态信息到设置模块, 它可以用 get_config_string() 函数读取.
void set_config_int(char *section, char *name, int val);
向当前设置文件写一个整数值. 见 set_config_string() 的注解.
void set_config_hex(char *section, char *name, int val);
以十六进制格式向当前的设置文件写一个整数.见 set_config_string() 的注解.
void set_config_float(char *section, char *name, float val);
向当前设置文件写一个浮点数值. 见 set_config_string() 的注解.
void set_config_id(char *section, char *name, int val);
写一个 4 字符的驱动器变量到当前的设置文件.
见 set_config_string() 的注释.
Allegro 在设置文件了使用了以下这些基本变量:
VGA - 基本 VGA MODX - Mode-X VBE1 - VESA 1.x VB2B - VBE 2.0 (分块) VB2L - VBE 2.0 (线形) VBE3 - VBE 3.0 VBAF - VBE/AF XTND - Xtended mode
BE - 比利时 CH - 瑞士 CZ - Czech DE - 德国 DK - 丹麦 DVORAK - Dvorak ES - 西班牙 FI - 芬兰 FR - 法国 IT - 意大利 NO - 挪威 PT - 葡萄牙 RU - 俄国 SE - 瑞典 UK - 英国 US - 美国
CZ - Czech DE - 德文 DK - 丹麦语 EN - 英文 ES - 西班牙文 FI - 芬兰语 FR - 法文 IT - 意大利文 RU - 俄文 SE - 瑞典语
0 - none SB - Sound Blaster (自动检测类型) SB10 - Sound Blaster 1.0 SB15 - Sound Blaster 1.5 SB20 - Sound Blaster 2.0 SBP - Sound Blaster Pro SB16 - Sound Blaster 16 ESS - ESS AudioDrive ESC - Ensoniq Soundscape
0 - none OPL - Adlib (自动检测 OPL 版本) OPL2 - OPL2 FM 合成 OPLX - 双(Dual) OPL2 (SB Pro-1) OPL3 - OPL3 FM 合成 SB - raw SB MIDI 界面 MPU - MPU-401 MIDI 界面 DIGI - DIGMID 软件波表 AWE - AWE32
0 - 快速混合 8 位数据到 16 位缓冲 1 - 真 16 位混合 (需要 16 位立体声声卡) 2 - 添入(interpolated) 15 位混合
这个部分由一组下面这样格式的行组成:
举个例子,下面这行:
p36 = 0 34 9 12
指定当 GM 的 36 号程序(program) (发生一个 fretless bass) 被选择, Allegro 将发送参数为 0 的组合(bank)变更消息 #0, 参数为 34 的组合(bank)变更消息 #32, 参数为 9 的程序(program) 变更消息, 然后将所有的声音提高八度.