我正在运行pulseaudio-1.1 的Ubuntu 32 和64 位平台上编译pulseaudio 1.1 附带的module-virtual-sink.c。当我在 32 位机器上加载模块时,我得到以下断言:
Dec 15 07:57:53 ubuntu pulseaudio[12541]: [alsa-sink] sink.c: Assertion 'max_latency <= (10*((pa_usec_t) 1000000ULL))' failed at pulsecore/sink.c:2971, function pa_sink_set_latency_range_within_thread(). Aborting.
在模块-virtual-sink.c 中:
pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
传递错误的值。i->sink->thread_info.min_latency, i->sink->thread_info.max_latency 正在传递 0 和 500 而不是 500 和 100000。
与在 soft_volume 之前的 pa_sink_new 中的 pulseaudio 创建的结构相比,我的 gcc 生成的 thread_info 结构中缺少 32 位
thread_info.soft_volume
导致读取错误值并将其传递给 pa_sink_set_latency_range_within_thread。
struct {
pa_sink_state_t state;
pa_hashmap *inputs;
pa_rtpoll *rtpoll;
pa_cvolume soft_volume;
pa_bool_t soft_muted:1;
typedef struct pa_cvolume {
uint8_t channels; /**< Number of channels */
pa_volume_t values[PA_CHANNELS_MAX]; /**< Per-channel volume */
} pa_cvolume;
(gdb) x /100xb &(u->sink->thread_info)
0x8b6c634: 0x00 0x00 0x00 0x00 0xfe 0xff 0xff 0xff
0x8b6c63c: 0x08 0xd0 0xb6 0x08 0x00 0x00 0x00 0x00
0x8b6c644: 0x02 0x00 0x00 0x00 0x00 0x00 0x01 0x00
(gdb) print (u->sink->thread_info)
$5 = {state = PA_SINK_RUNNING, inputs = 0xfffffffe, rtpoll = 0x8b6d008, soft_volume = {channels = 0 '\000', values = {2,65536, 65536,
thread_info.soft_volume.channels 是 0 而不是 2。编译后的代码看错了位置 - 地址 0x8b6c640 而不是 0x8b6c644
我怀疑编译器配置问题或源不匹配。不用说,这是在使用 ../configure 创建 config.h 文件后使用 GCC 测试的
任何想法可能导致这种行为?