播放自定义生成的声音 - AudioTrack.play 引发异常



我需要播放来自我的 Xamarin 安卓应用程序的自定义生成的声音。我当前的代码如下所示:

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.异常。

我已经看到了这个问题,从那里我了解到我可能必须对样本的字节序做一些事情,但这在这一点上应该无关紧要,而且接受答案中的代码看起来几乎与我的示例一模一样,这让我更加困惑。甚至尝试注释掉SetLoopPoints行以使其看起来完全相同,都没有帮助。

在安卓 5.1 上测试。

问题的原因是您track的状态是AudioTrackState.NoStaticData

你已经创建了一个长度为bufferSize / 2的源,但是当你把源写入AudioTrack时,你试图用长度bufferSize写入数据,数据没有补充。

只需将您的代码track.Write(source, 0, bufferSize);更改为track.Write(source, 0, source.Length);即可。

最新更新