2014-04-07 5 views
0

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; 
    } 

감사합니다!

답변

2

소리가 왜곡 된 이유는 다음과 같습니다. 샘플은 부호없는 8 비트 형식으로 저장되었지만 샘플 값은 beign 255로 정의되었습니다. 전체 스케일링은 역순으로되어 있습니다. .

*out++ = (float) (((-1)*data->getSample(::actualSample)+127)/128); 

*out++ = (float) ((data->getSample(::actualSample)-127)/128); 

와 모든 좋은 갔다 :

나는 라인을 변경했습니다.

만약 누군가를 도울 수있는 경우.