2014-09-23 2 views
0

작동하는 Android 응용 프로그램을 개발했으며이 중 C# 버전을 만들려고합니다. 버퍼 데이터를 검색하고 바이트 배열로 전달하는 데 막혔습니다. 프로젝트를 NAudio 등에 참조했습니다.NAudio C# : 추가 조작을 위해 WaveInEventArgs에서 바이트 배열을 얻는 방법

프로젝트를 통해 대기 시간을 프로그래밍 방식으로 조정 했으므로 프로젝트를 통해 마이크 입력을 읽고 스피커를 통해 지연 시간을 거의 출력 할 수있게되었습니다. 그러나 버퍼 데이터를 검색하는 데 어려움이 있습니다. 어떻게 waveInEventArgs를 가지고 놀 수 있습니까? 나는 waveIn의 데이터가 waveInEventArgs.buffer로 전달된다는 것을 이해하지만, 그냥 버퍼 데이터를 가져 와서 그것을 배치 할 수 없다. 어떻게해야합니까?

private void RecorderOnDataAvailable(object sender, WaveInEventArgs waveInEventArgs) 
    { 
     bufferedWaveProvider.AddSamples(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded); 
    } 

    public String processAudioFrame(short[] audioFrame) 
    { 
     double rms = 0; 
     for (int i = 0; i < audioFrame.Length; i++) 
     { 
      rms += audioFrame[i] * audioFrame[i]; 
     } 

     rms = Math.Sqrt(rms/audioFrame.Length); 

     double mGain = 2500.0/Math.Pow(10.0, 90.0/20.0); 
     double mAlpha = 0.9; 
     double mRmsSmoothed = 0; 

     //compute a smoothed version for less flickering of the display 
     mRmsSmoothed = mRmsSmoothed * mAlpha + (1 - mAlpha) * rms; 
     double rmsdB = 20.0 * Math.Log10(mGain * mRmsSmoothed); 

     //assign values from rmsdB to debels for comparison in errorCorrection() method 
     double debels = rmsdB + 20; 

     String value = debels.ToString(); 
     return value; 
    } 

변수 값은 내가 디자인에 구현 한 텍스트 상자에 결과를 표시하는 문자열로 반환됩니다 : 여기

내 코드입니다.

감사합니다. 나는이 프로젝트를 2 일 전에 시작 했으므로 간단한 용어로 설명하면 크게 감사하겠습니다.

답변

0

아마도 가장 쉬운 방법은 Buffer.BlockCopy을 사용하여 바이트 배열을 짧은 배열로 변환 한 다음 processAudioFrame 함수로 전달하는 것입니다. 다음과 같은 내용 :

short[] sampleData = new short[waveInEventArgs.BytesRecorded/2]; 
Buffer.BlockCopy(waveInEventArgs.Buffer, 0, sampleData, 0, waveInEventArgs.BytesRecorded); 
var decibels = processAudioFrame(sampleData) 
관련 문제