Реализация потока в PortAudio v19

Модератор: Модераторы разделов

Ответить
nickmus-zlob
Сообщения: 11
ОС: Linux + Windows XP Pro

Реализация потока в PortAudio v19

Сообщение nickmus-zlob »

Попробовал сделать простеший пример аудио-приложения, которое должно после запуска воспроизводить ввод с микрофона, дожидаясь нажатия клавиши.

Делаю программу на KDevelop 3.2
Вот текст программы (callback - в другом файле, но до него дело не доходит).
*********************************************************************
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>

#include <portaudio.h>

extern PaStreamCallback playInputINT16;
using namespace std;

int main(int argc, char *argv[])
{
cout << "Hello, world, it is portAudio !" << endl;
// Инициализация
PaError err = Pa_Initialize();
if( err != paNoError ) {
cout << "PortAudio error:\n" << Pa_GetErrorText( err ) << endl;
return EXIT_SUCCESS;
}
cout << "Инициализация завершена." << endl;
// Поиск хоста ALSA
const PaHostApiInfo * hostApiInfo = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex(paALSA) );
if(!hostApiInfo) {
cout << "Не удалось получить инфо о хосте ALSA.\n";
Pa_Terminate();
return 0;}
cout << "Найден хост ALSA.\n"
<< "Версия: " << hostApiInfo->structVersion << endl
<< "Тип: " << hostApiInfo->type << endl
<< "Имя: " << hostApiInfo->name << endl
<< "Количество устройств: " << hostApiInfo->deviceCount << endl;
// Поиск устройств ALSA
PaDeviceIndex devCount = Pa_GetDeviceCount();
PaDeviceInfo * devInfo;
while( devCount )
{
devInfo = (PaDeviceInfo*)Pa_GetDeviceInfo(devCount - 1);
cout << "\nУстройство " << (devCount - 1)
<< ": \n Name: " << devInfo->name
<< "\n Host API: " << devInfo->hostApi
<< "\n Max In-channels: " << devInfo->maxInputChannels
<< "\n Max Out-channels: " << devInfo->maxOutputChannels
<< endl;
devCount--;
}

PaDeviceInfo * inputDevInfo = (PaDeviceInfo*)Pa_GetDeviceInfo(2);
PaDeviceInfo * outputDevInfo = (PaDeviceInfo*)Pa_GetDeviceInfo(1);
// Создание параметров потока
cout << "Создание параметров потока.\n";
PaStreamParameters inputParams, outputParams;
inputParams.device = 2;
inputParams.channelCount = 2;
inputParams.sampleFormat = paInt16;
inputParams.suggestedLatency = inputDevInfo->defaultLowInputLatency;
inputParams.hostApiSpecificStreamInfo = NULL;

outputParams.device = 1;
outputParams.channelCount = 2;
outputParams.sampleFormat = paInt16;
outputParams.suggestedLatency = outputDevInfo->defaultLowOutputLatency;
outputParams.hostApiSpecificStreamInfo = NULL;
// Открытие потока
cout << "Открытие потока.\n";
PaStream * stream;
err = Pa_OpenStream(
&stream,
&inputParams,
&outputParams,
48000.0,
4096,
paNoFlag,
playInputINT16,
0
);

if( err != paNoError ) {
cout << "PortAudio error:\n" << Pa_GetErrorText( err ) << endl;
Pa_Terminate();
return EXIT_SUCCESS;
}
// Запуск потока
cout << "Запуск потока.\n";
err = Pa_StartStream(stream);
if( err != paNoError ) {
cout << "PortAudio error:\n" << Pa_GetErrorText( err ) << endl;
Pa_Terminate();
return EXIT_SUCCESS;
}
char cmd;
cout << "Поток запущен. Введите символ и нажмите ENTER для завершения..."; cin >> cmd;
// Останов потока
cout << "Останов потока.\n";
err = Pa_StopStream(stream);
if( err != paNoError ) {
cout << "PortAudio error:\n" << Pa_GetErrorText( err ) << endl;
Pa_Terminate();
return EXIT_SUCCESS;
}
// Закрытие потока
cout << "Закрытие потока.\n";
err = Pa_CloseStream(stream);
if( err != paNoError ) {
cout << "PortAudio error:\n" << Pa_GetErrorText( err ) << endl;
return EXIT_SUCCESS;
}

QUIT: Pa_Terminate();
cout << "Точка выхода из программы.\n";
return EXIT_SUCCESS;
}

*****************************************************************

После запуска выводит:
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Hello, world, it is portAudio !
JACK tmpdir identified as [tmp]
Инициализация завершена.
Найден хост ALSA.
Версия: 1
Тип: 8
Имя: ALSA
Количество устройств: 11

Устройство 11:
Name: spdif
Host API: 1
Max In-channels: 16
Max Out-channels: 2

Устройство 10:
Name: iec958
Host API: 1
Max In-channels: 16
Max Out-channels: 2

Устройство 9:
Name: surround50
Host API: 1
Max In-channels: 0
Max Out-channels: 128

Устройство 8:
Name: surround41
Host API: 1
Max In-channels: 0
Max Out-channels: 128

Устройство 7:
Name: center_lfe
Host API: 1
Max In-channels: 0
Max Out-channels: 2

Устройство 6:
Name: rear
Host API: 1
Max In-channels: 0
Max Out-channels: 2

Устройство 5:
Name: front
Host API: 1
Max In-channels: 0
Max Out-channels: 2

Устройство 4:
Name: SBLive! Value [CT4832]: Multichannel Playback (hw:0,3)
Host API: 1
Max In-channels: 0
Max Out-channels: 16

Устройство 3:
Name: SBLive! Value [CT4832]: Multichannel Capture/PT Playback (hw:0,2)
Host API: 1
Max In-channels: 16
Max Out-channels: 2

Устройство 2:
Name: SBLive! Value [CT4832]: Mic Capture (hw:0,1)
Host API: 1
Max In-channels: 2
Max Out-channels: 0

Устройство 1:
Name: SBLive! Value [CT4832]: ADC Capture/Standard PCM Playback (hw:0,0)
Host API: 1
Max In-channels: 0
Max Out-channels: 2

Устройство 0:
Name: /dev/dsp
Host API: 0
Max In-channels: 0
Max Out-channels: 16
Создание параметров потока.
Открытие потока.
Expression 'SetApproximateSampleRate( pcm, hwParams, sr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1114
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->capture, inParams, self->primeBuffers, hwParamsCapture, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1665
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1789
PortAudio error:
Invalid sample rate
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.

Насколько я понимаю, глючит ALSA (PaHostApiCount() равен 2: 0 - OSS, 1 - ALSA.
Недавно собрал JACK v0.103. Опция --with-portaudio привела к краху компиляции, скомпилировал без нее.
Операционка - ASP Linux 11
Спасибо сказали:
Ответить