wav 파일을 읽고 portaudio를 통해 재생하려고하는 작은 코드를 작성했습니다.C++ 및 portaudio, 몹시 왜곡 된 출력
필자는 선형 pcm (압축 없음), 2 채널 이상을 사용하지 않고 일부 특정 wav 파일을 사용하지 않았습니다. 내가 볼 수 있듯이, wav 파일 디코딩은 잘 작동합니다. 나는 나중에 portaudio를 통해 재생할 때 문제가 있다고 생각합니다.
제 테스트를 위해 지나치게 간단한 wav 파일 (짧은 : 8 비트 비트 심도, 11025 샘플 속도, 모노 및 약 3 초 길이)을 선택했습니다.
그럼 일단 모든 샘플을 준비했는데 portaudio로 가져 왔고 (자습서 예제에서와 같이 -1.0f와 1.0f 사이의 값을 갖게 됨) 소리를 인식 할 수 있지만 끔찍하게 왜곡되었습니다. ...
샘플 속도 (11025 hz는 상당히 표준 임)로 인해서 Pa_getDeviceInfo-> getDefaultSampleRate (44100hz)에 지정된 속도로 다시 샘플링 할 수 있다고 생각했습니다.
하지만 같은 결과가 나타납니다. 나는 여전히 더 나아지지 않는 다른 장치를 선택하려고했다.
Bjorn Roche (http://blog.bjornroche.com/2011/11/slides-from-fundamentals-of-audio.html)의 일부 슬라이드에서 스케일링 방식이 좋지 않았지만 대안이 없습니다.
구성에 문제가 있습니까? 아니면 샘플링과 오디오 재생에 대해 중요한 것을 놓쳤습니까? 내가 portaudio와 리눅스와 ALSA를 사용하고 있습니다 그런데
(이 오디오 프로그램에서 첫 샷) 및 portaudio을 초기화 할 때 나는이 오류 메시지가 : 나는 다음과 같은 내 콜백 함수를 정의
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
bt_audio_service_open: connect() failed: Connection refused (111)
: (이 특정 파일 만 재생)
unsigned int actualSample;
static int patestCallback(const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData)
{
/* Cast data passed through stream to my wav file. */
WavSound *data = (WavSound*)userData;
float *out = (float*)outputBuffer;
unsigned int i;
(void) inputBuffer; /* Prevent unused variable warning. */
for(i=0; i<framesPerBuffer; i++)
{
*out++ = (float) ((data->getSample(::actualSample)-127)/128);
::actualSample = ::actualSample + 1;
if(::actualSample >= data->getSamplesSize())
::actualSample = 0;
}
return 0;
}
감사합니다!