私は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プロジェクトのWebサイトで提供されている正弦波生成のサンプルコードをコンパイルしようとしています。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++) {
andno match for operator++
と宣言されました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プログラムにコンパイルされるように名前を変更するか、使用するCヘッダーをmain.c
含む正しいC ++メソッドを使用し、自分のコードがC ++標準に準拠していることを確認してください。extern "C"
g++