Я недавно начал читать о Alsa Api. Я пытался написать класс C ++, который открывает устройство по умолчанию и считывает основные параметры, такие как максимальная скорость, количество каналов и т. Д.
Мой заголовочный файл класса:
#include <alsa/asoundlib.h>
#include <iostream>
class AlsaParam{
snd_pcm_t* pcm_handle;
snd_pcm_hw_params_t* hw_param;
....
public:
int pcm_open();
.....
};
Внутри pcm_open ()
int AlsaParam::pcm_open(){
int err = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
if(err > -1)
std::cout << pcm_handle->name << std::endl; //Just to test if it works
return err;
}
Я получаю следующую ошибку:
error: invalid use of incomplete type ‘snd_pcm_t {aka struct _snd_pcm}’
std::cout << pcm_handle->name << std::endl;
^
In file included from /usr/include/alsa/asoundlib.h:54:0,
from alsa_param.h:4,
from alsa_param.cpp:1:
/usr/include/alsa/pcm.h:341:16: error: forward declaration of ‘snd_pcm_t {aka struct _snd_pcm}’
typedef struct _snd_pcm snd_pcm_t;
^
Из этой ошибки я понял, что asoundlib.h использует typedef только для struct snd_pcm_t, но он определен где-то еще. Я прав? Есть ли способ решить эту проблему? В общем, если мы включаем некоторые функции библиотеки c в класс C ++, что следует помнить / избегать? Спасибо
Макет struct _snd_pcm
намеренно скрыт от программ, поскольку может измениться в новой версии библиотеки.
Чтобы узнать имя устройства PCM, позвоните snd_pcm_name:
cout << snd_pcm_name(pcm_handle) << endl;
(Практически все в ALSA нуждается в таком вызове функции.)
В вашем коде нет ничего плохого. Просто отсутствует декларация struct _snd_pcm
заголовок, который вы включили, имеет только typedef: typedef struct _snd_pcm snd_pcm_t;
Что вы можете сделать, это посмотреть (возможно, в Интернете или в руководстве) для заголовка, который имеетstruct _snd_pcm
объявление и включить его в свой код.
Есть несколько различий в синтаксисе объявления между C и C ++.
Поскольку вы компилируете файл C ++, но включаете в него заголовок C, вам, вероятно, нужно заставить компилятор правильно интерпретировать его.
Попробуй это:
extern "C"{
#include <alsa/asoundlib.h>
}
#include <iostream>
class AlsaParam{
snd_pcm_t* pcm_handle;
snd_pcm_hw_params_t* hw_param;
...