이 문제는 C++ 프로그램을 작성하는 동안 발생했기 때문에 문제를 더 명확하게 하기 위해 최소한의 코드 예제를 만들었습니다.
#include <portaudio.h>
#include <iostream>
int main()
{
Pa_Initialize();
int devices = Pa_GetDeviceCount();
std::cout << devices << std::endl;
for (int i = 0; i != devices; ++i)
{
auto * info = Pa_GetDeviceInfo(i);
std::cout << info->name << std::endl;
}
Pa_Terminate();
}
따라서 이 코드는 내가 가지고 있는 사운드 IO 장치를 인쇄해야 합니다. 나는 이 코드를 두 대의 Linux 컴퓨터(ubuntu 16 및 ubuntu 18.10)에서 테스트했으며 결과를 변경하기 위해 겉보기에 불합리해 보이는 조정을 수행했으며(이러한 조정에 대해서는 나중에 설명하겠습니다) 결과는 말도 안됩니다. 처음으로 Ubuntu 16에서 애플리케이션을 실행하고 있는데 sysdefault(유용한 장치)를 포함하여 많은 장치를 감지합니다. 그런 다음 우분투 18에서 동일한 응용 프로그램을 실행했지만 내 sysdefault를 찾지 못했습니다. 명령을 확인한 aplay -L
후 arecord -L
Alsa가 sysdefault를 인식하는 것을 확인하여 펄스 오디오 문제라고 생각했습니다. pavucontrol을 다운로드하고 일부 조정을 했지만 성공하지 못했습니다. 마지막으로 이것은 더 불합리한 일입니다. pavucontrol을 다운로드하고 조정한 후 ubuntu 16에서 내 응용 프로그램을 다시 사용하려고 시도했지만 작동하지 않았고 ubuntu 16에서 pavucontrol을 제거했을 때 작동했습니다. 그러나 ubuntu 18에서 동일한 작업을 수행하면 그렇지 않습니다! 내 우분투 16은 오래된 시스템이고 많은 cpp 라이브러리가 설치되어 있고 지난 몇 년 동안 많이 조정되었지만 반면에 내 우분투 18은 포맷된 노트북이며 거의 아무것도 설치되어 있지 않다는 점을 언급할 가치가 있습니다. 여기에 문제를 더 잘 이해하기 위해 몇 가지 콘솔 출력을 추가합니다.
$aplay -L
>
> default
> Playback/recording through the PulseAudio sound server null
> Discard all samples (playback) or generate zero samples (capture) pulse
> PulseAudio Sound Server hdmi:CARD=HDMI,DEV=0
> HDA Intel HDMI, HDMI 0
> HDMI Audio Output hdmi:CARD=HDMI,DEV=1
> HDA Intel HDMI, HDMI 1
> HDMI Audio Output hdmi:CARD=HDMI,DEV=2
> HDA Intel HDMI, HDMI 2
> HDMI Audio Output dmix:CARD=HDMI,DEV=3
> HDA Intel HDMI, HDMI 0
> Direct sample mixing device dmix:CARD=HDMI,DEV=7
> HDA Intel HDMI, HDMI 1
> Direct sample mixing device dmix:CARD=HDMI,DEV=8
> HDA Intel HDMI, HDMI 2
> Direct sample mixing device dsnoop:CARD=HDMI,DEV=3
> HDA Intel HDMI, HDMI 0
> Direct sample snooping device dsnoop:CARD=HDMI,DEV=7
> HDA Intel HDMI, HDMI 1
> Direct sample snooping device dsnoop:CARD=HDMI,DEV=8
> HDA Intel HDMI, HDMI 2
> Direct sample snooping device hw:CARD=HDMI,DEV=3
> HDA Intel HDMI, HDMI 0
> Direct hardware device without any conversions hw:CARD=HDMI,DEV=7
> HDA Intel HDMI, HDMI 1
> Direct hardware device without any conversions hw:CARD=HDMI,DEV=8
> HDA Intel HDMI, HDMI 2
> Direct hardware device without any conversions plughw:CARD=HDMI,DEV=3
> HDA Intel HDMI, HDMI 0
> Hardware device with all software conversions plughw:CARD=HDMI,DEV=7
> HDA Intel HDMI, HDMI 1
> Hardware device with all software conversions plughw:CARD=HDMI,DEV=8
> HDA Intel HDMI, HDMI 2
> Hardware device with all software conversions sysdefault:CARD=PCH
> HDA Intel PCH, ALC3234 Analog
> Default Audio Device front:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> Front speakers surround21:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> 2.1 Surround output to Front and Subwoofer speakers surround40:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> 4.0 Surround output to Front and Rear speakers surround41:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> 4.1 Surround output to Front, Rear and Subwoofer speakers surround50:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> 5.0 Surround output to Front, Center and Rear speakers surround51:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> 5.1 Surround output to Front, Center, Rear and Subwoofer speakers surround71:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> 7.1 Surround output to Front, Center, Side, Rear and Woofer speakers dmix:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> Direct sample mixing device dsnoop:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> Direct sample snooping device hw:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> Direct hardware device without any conversions plughw:CARD=PCH,DEV=0
> HDA Intel PCH, ALC3234 Analog
> Hardware device with all software conversions
그리고 애플리케이션을 실행합니다:
$./main
6
HDA Intel HDMI: 0 (hw:0,3)
HDA Intel HDMI: 1 (hw:0,7)
HDA Intel HDMI: 2 (hw:0,8)
hdmi
pulse
default
질문/요청은 다음과 같습니다. 문제의 원인은 무엇입니까? alsa가 아닐 수도 있으니 portaudio인가요? 하지만 첫 번째 경우에는 작동하므로 펄스오디오인가요? 그렇다면 이제 재현해 보았으니 어떻게 문제를 해결할 수 있을까요?
답변1
따라서 이 코드는 내가 가지고 있는 사운드 IO 장치를 인쇄해야 합니다.
아니요, 그렇지 않습니다. 그것은 인쇄됩니다포르타디오해결될 수도 있고 해결되지 않을 수도 있는 추상화인 장치알자스장비(오늘날 대부분의 경우 그럴 수 있지만).
특히 Portaudio 개발자는 일부 ALSA 장치(특히 순수 하드웨어 장치)만 포함하고 ALSA 플러그인은 포함하지 않기로 결정한 것 같습니다.
모두 나열하고 싶다면알자스장치, Portaudio 대신 ALSA 라이브러리를 사용하는 것은 어떨까요? Portaudio는 항상 몇 가지 추상화를 제공하므로 이 추상화를 수락하고 사용하거나 Portaudio를 사용하지 마십시오.
또한 참고하시기 바랍니다펄스 방송완전히 다른 문제가 발생합니다. Pulseaudio는 모든 하드웨어 ALSA 장치를 획득하므로 Portaudio에서 사용할 수 있는 유일한 장치는 pulse
(또는 default
을 가리키는 경우 pulse
)입니다.
따라서 Pulseaudio를 사용하고 Pulseaudio 수신기(Pulseaudio가 보는 하드웨어 장치 포함)를 나열하려면 Pulseaudio 라이브러리를 사용하십시오.
답변2
결국 문제는 아르샤의 것이었다. Ubuntu 18 시스템에 사운드 카드(또는 최소한 가상 사운드 카드)를 설치해야 하며 Alsa는 기본적으로 사운드 카드만 읽습니다. 이 문제에 대한 해결 방법은 여러 가지가 있습니다. 저에게 효과적이었던 방법은 /etc/asound.conf
다음 두 줄이 포함된 구성 파일을 변경/생성하는 것이었습니다.
defaults.pcm.card 2
defaults.ctl.card 1
~
기본 카드가 변경됩니다.