2017-09-20 12 views
0

アンドロイド用のXamarinアプリからカスタム生成音を再生する必要があります。私の現在のコードは次のようになります。カスタム生成されたサウンドを再生する - AudioTrack.playが例外をスローする

public class NotePlayer { 
     private const int sampleRate = 44100; 
     private const int bufferSize = 22050; 
     private Task<AudioTrack> track = null; 
     public double Frequency { get; private set; } 

     public NotePlayer(double frequency) { 
      this.Frequency = frequency; 
     } 

     public void Play() { 
      short[] source = new short[bufferSize/2]; 
      for(int i= 0; i<source.Length; i++) { 
       source[i] = (short)(Math.Sin(((double)i)/sampleRate * Frequency* Math.PI*2)*Int16.MaxValue); 
      } 
      var track = new AudioTrack(Stream.Music, sampleRate, ChannelOut.Mono, Android.Media.Encoding.Pcm16bit, bufferSize, AudioTrackMode.Static); 
      track.Write(source, 0, bufferSize); 
      track.SetLoopPoints(0, bufferSize/2, -1); 
      track.Play(); 
      this.track = Task.FromResult(track); 
     } 

     //Some more methods here 
} 

問題は、私は()ラインtrack.playにJava.Lang.IllegalStateException: play() called on uninitialized AudioTrack.例外を得続けることです。

this私は自分のサンプルのエンディアン性で何かをしなければならないかもしれないことを理解したところから質問しましたが、この点で問題ではありませんし、受け入れられた回答のコードも、私はさらに混乱してしまいます。 SetLoopPointsの行を完全に似ているようにコメントしてみても、助けにはならなかった。

アンドロイド5.1でテスト済みです。

答えて

0

あなたの問題の原因は、trackの状態がAudioTrackState.NoStaticDataであることです。

長さがbufferSize/2のソースを作成しましたが、ソースをAudioTrackに書き込むと、長さがbufferSizeのデータを書き込もうとしましたが、データは補完されませんでした。

コードtrack.Write(source, 0, bufferSize);track.Write(source, 0, source.Length);に変更してください。

関連する問題