저는 Raspberry Pi 0W와 최신 Raspberry Pi OS를 사용하고 있습니다.
나는 libasound2와 libasound2-dev를 설치했고,라즈베리 파이 포럼alsa 라이브러리가 올바르게 컴파일되고 실행되는지 테스트하는 데 사용됩니다.
#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
#include <alsa/pcm.h>
int main() {
int val;
printf("ALSA library version: %s\n", SND_LIB_VERSION_STR);
printf("\nPCM stream types:\n");
for (val = 0; val <= SND_PCM_STREAM_LAST; val++)
printf(" %s\n",
snd_pcm_stream_name((snd_pcm_stream_t)val));
return 0;
}
ALSA 프로젝트 웹사이트에 제공된 사인파 생성 예제 코드를 컴파일하려고 합니다.https://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html
이는 예제 페이지에 pcm.c로 나열되어 있습니다.
이 코드를 main.cpp에 저장하고 다음으로 변경했습니다 #include "../include/asoundlib.h"
(이로 인해 컴파일할 때 파일을 찾을 수 없음 오류가 발생함).#include <alsa/asoundlib.h>
나는 이것을 사용하여 이것을 컴파일합니다 gcc main.cpp -o main -lasound -fpermissive
. 일련의 경고가 표시되지만 결국 디스플레이 for (format = 0; format < SND_PCM_FORMAT_LAST; format++) {
에는 no match for operator++
and 로 선언 되었습니다 operand type is 'snd_pcm_format_t' {aka '_snd_pcm_format'})
.format
static snd_pcm_format_t format = SND_PCM_FORMAT_S16;
snd_pcm_format_t
그들의 문서에 따르면.
이 기본 예제를 컴파일하려면 어떻게 해야 합니까? 아니면 C++를 사용하여 ALSA에서 사인 톤을 생성하는 방법을 보여주는 간단한 예나 ALSA의 샘플 코드 작동 방식을 설명하는 블로그 또는 튜토리얼이 있습니까?
편집: 빌드 중에 표시되는 메시지는 다음과 같습니다. [오류는 다음과 같습니다.main.cpp:842:66: 오류: 'operator++'와 일치하지 않습니다.]
$ gcc main.cpp -o Main -lasound -fpermissive
main.cpp:19:23: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
static char *device = "plughw:0,0"; /* playback device */
^~~~~~~~~~~~
main.cpp: In function ‘int write_and_poll_loop(snd_pcm_t*, short int*, snd_pcm_channel_area_t*)’:
main.cpp:314:18: warning: invalid conversion from ‘void*’ to ‘pollfd*’ [-fpermissive]
ufds = malloc(sizeof(struct pollfd) * count);
~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp: In function ‘void async_callback(snd_async_handler_t*)’:
main.cpp:397:77: warning: invalid conversion from ‘void*’ to ‘async_private_data*’ [-fpermissive]
ct async_private_data *data = snd_async_handler_get_callback_private(ahandler);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
main.cpp: In function ‘void async_direct_callback(snd_async_handler_t*)’:
main.cpp:469:77: warning: invalid conversion from ‘void*’ to ‘async_private_data*’ [-fpermissive]
ct async_private_data *data = snd_async_handler_get_callback_private(ahandler);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
main.cpp: In function ‘void help()’:
main.cpp:756:53: warning: invalid conversion from ‘int’ to ‘snd_pcm_format_t’ {aka ‘_snd_pcm_format’} [-fpermissive]
const char *s = snd_pcm_format_name(k);
^
In file included from /usr/include/alsa/asoundlib.h:54,
from main.cpp:14:
/usr/include/alsa/pcm.h:1065:56: note: initializing argument 1 of ‘const char* snd_pcm_format_name(snd_pcm_format_t)’
const char *snd_pcm_format_name(const snd_pcm_format_t format);
~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
main.cpp: In function ‘int main(int, char**)’:
main.cpp:842:27: warning: invalid conversion from ‘int’ to ‘snd_pcm_format_t’ {aka ‘_snd_pcm_format’} [-fpermissive]
for (format = 0; format < SND_PCM_FORMAT_LAST; format++) {
^
main.cpp:842:66: warning: no ‘operator++(int)’ declared for postfix ‘++’, trying prefix operator instead [-fpermissive]
for (format = 0; format < SND_PCM_FORMAT_LAST; format++) {
~~~~~~^~
main.cpp:842:66: error: no match for ‘operator++’ (operand type is ‘snd_pcm_format_t’ {aka ‘_snd_pcm_format’})
main.cpp:903:21: warning: invalid conversion from ‘void*’ to ‘short int*’ [-fpermissive]
samples = malloc((period_size * channels * snd_pcm_format_physical_width(format)) / 8);
~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:909:19: warning: invalid conversion from ‘void*’ to ‘snd_pcm_channel_area_t*’ {aka ‘_snd_pcm_channel_area*’} [-fpermissive]
areas = calloc(channels, sizeof(snd_pcm_channel_area_t));
~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$
gcc 대신 g++를 사용하면 동일한 오류가 발생합니다.
답변1
C++ 프로그램으로 컴파일하려고 합니다("ISO C++ 금지됨..."). 따라서 포함된 헤더가 C++가 아닌 C이기 때문에 다양한 경고가 발생합니다.
main.cpp
C 프로그램으로 컴파일 되도록 이름을 바꾸 거나 사용할 main.c
C 헤더를 포함하는 올바른 C++ 방식을 사용 하고 자신의 코드가 C++ 표준을 따르는지 확인하십시오.extern "C"
g++