我正在编写一个程序,从两个单声道 ALSA 设备读取并将它们写入一个立体声 ALSA 设备。
我使用三个线程和乒乓缓冲区来管理它们。两个阅读线程和一个写作线程。它们的配置如下:
// Capture ALSA device
alsaBufferSize = 16384;
alsaCaptureChunkSize = 4096;
bitsPerSample = 16;
samplingFrequency = 24000;
numOfChannels = 1;
block = true;
accessType = SND_PCM_ACCESS_RW_INTERLEAVED;
// Playback device (only list params that are different from above)
alsaBufferSize = 16384 * 2;
numOfChannels = 2;
accessType = SND_PCM_ACCESS_RW_NON_INTERLEAVED;
Run Code Online (Sandbox Code Playgroud)
两个读取线程将写入 ping 缓冲区,然后写入 pong 缓冲区。写入线程将等待两个缓冲区中的任何一个准备好,锁定它,读取它,然后解锁它。
但是当我运行这个程序时,出现xrun并且无法恢复。
ALSA lib pcm.c:7316:(snd_pcm_recover) underrun occurred
ALSA lib pcm.c:7319:(snd_pcm_recover) cannot recovery from underrun, prepare failed: Broken pipe
Run Code Online (Sandbox Code Playgroud)
下面是我写入 ALSA 播放设备的代码:
bool CALSAWriter::writen(uint8_t** …
Run Code Online (Sandbox Code Playgroud) 我有一个头文件foo.h
:
#ifndef __FOO_H__
#define __FOO_H__
const char* USB_MANAGER_DBUS_SERVICE = "com.USBService";
#define USB_MANAGER_DBUS_OBJ_PATH "/com/USB/MgrObject"
const int DBUS_CONNECTION_MAX_RETRY_TIME = 5;
#endif
Run Code Online (Sandbox Code Playgroud)
以及许多包含foo.h
.
foo.c bar.c
Run Code Online (Sandbox Code Playgroud)
当它们一起编译时,出现“多重定义错误”。
Linking CXX shared library:
foo.cpp.o:(.data.rel.local+0x0): multiple definition of `USB_MANAGER_DBUS_SERVICE'
bar.cpp.o:(.data.rel.local+0x0): first defined here
Run Code Online (Sandbox Code Playgroud)
所以我有以下两个问题:
#define
导致链接错误?const int
导致链接错误?