小编Pet*_*ter的帖子

ALSA:无法从欠载中恢复,准备失败:管道损坏

我正在编写一个程序,从两个单声道 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)

c++ multithreading broken-pipe alsa

4
推荐指数
1
解决办法
6449
查看次数

为什么C++中的多重定义错误不是由const int声明引起的?

我有一个头文件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)

所以我有以下两个问题:

  1. 为什么不会#define导致链接错误?
  2. 为什么不会const int导致链接错误?

c++ linker

2
推荐指数
1
解决办法
1475
查看次数

标签 统计

c++ ×2

alsa ×1

broken-pipe ×1

linker ×1

multithreading ×1