2

我正在运行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 测试的

任何想法可能导致这种行为?

4

0 回答 0