C# Xamarin:播放声音一分钟

C# Xamarin:播放声音一分钟,c#,android,audio,xamarin,xamarin-studio,C#,Android,Audio,Xamarin,Xamarin Studio,我试着演奏一分钟的声音。我可以这样做,但我这样做会先产生声音缓冲区,然后再播放,这花费了太多的时间,有一个很大的延迟。所以现在我试着在播放时产生声音缓冲区,这样就不会有延迟了。它播放了4秒钟,然后停止了,但是我不能再点击我的按钮一分钟。所以我认为代码仍然在运行,即使我听不到任何声音 这是我的密码: public void play() { short[] buffer = new short[44100]; track = new AudioTrac

我试着演奏一分钟的声音。我可以这样做,但我这样做会先产生声音缓冲区,然后再播放,这花费了太多的时间,有一个很大的延迟。所以现在我试着在播放时产生声音缓冲区,这样就不会有延迟了。它播放了4秒钟,然后停止了,但是我不能再点击我的按钮一分钟。所以我认为代码仍然在运行,即使我听不到任何声音

这是我的密码:

public void play()
    {   
        short[] buffer = new short[44100];
        track = new AudioTrack (Stream.Music, 44100, ChannelOut.Mono, Encoding.Pcm16bit, 5292000, AudioTrackMode.Static);
        track.SetPlaybackRate (44100);
        while (n2 < 5292000) {
            for (int n = 0; n < 44100; n++) {

                float temp1 = (float)( Amplitude * Math.Sin ((2 * Math.PI * Frequency * n2) / 44100D));
                byte[] bytes = BitConverter.GetBytes (temp1);
                buffer [n] = (short)(temp1 * short.MaxValue);
                n2++;
            }
            int buffer_number = track.Write (buffer, 0, buffer.Length);
            track.Play();
        }

        track.Release();
    }
public void play()
{   
short[]buffer=新的short[44100];
曲目=新的音频曲目(Stream.Music,44100,ChannelOut.Mono,Encoding.Pcm16bit,5292000,AudioTrackMode.Static);
track.SetPlaybackRate(44100);
而(n2<5292000){
对于(int n=0;n<44100;n++){
float temp1=(float)(振幅*数学Sin((2*数学π*频率*n2)/44100D);
byte[]bytes=BitConverter.GetBytes(temp1);
缓冲区[n]=(短)(temp1*short.MaxValue);
n2++;
}
int buffer_number=track.Write(buffer,0,buffer.Length);
track.Play();
}
track.Release();
}
我尝试使用AudioTrackMode流 但当程序进入Track.play时,会抛出运行时错误: 在未初始化的AudioTrack上调用play()


那么我做错了什么呢?

以下是我如何让它在c#中工作的浓缩版本,基于android示例:

public void playSound()
{   
var持续时间=1;
var采样器=8000;
var numSamples=持续时间*采样器;
var样本=新的双精度[numSamples];
var频率=1900;
byte[]generatedSnd=新字节[2*个样本];
对于(int i=0;i>8);
}
var track=新的音频曲目(全局::Android.Media.Stream.Music,sampleRate,ChannelOut.Mono,Encoding.Pcm16bit,numSamples,AudioTrackMode.Static);
track.Write(generatedSnd,0,numSamples);
track.Play();
}

根据您的需要调整
持续时间
和'frequeoftone`.

我猜是
新音轨
音轨。Write
您必须输入
generatedSnd.Length
而不是
numSamples
,因为它要求音频大小以字节为单位(这是这里示例的两倍)。否则,您将只复制/播放创建的声音缓冲区的前半部分。
public void playSound()
        {   
            var duration = 1;
            var sampleRate = 8000;
            var numSamples = duration * sampleRate;
            var sample = new double[numSamples];
            var freqOfTone = 1900;
            byte[] generatedSnd = new byte[2 * numSamples];

            for (int i = 0; i < numSamples; ++i) {
                sample[i] = Math.Sin(2 * Math.PI * i / (sampleRate/freqOfTone));
            }

            int idx = 0;
            foreach (double dVal in sample) {
                short val = (short) (dVal * 32767);
                generatedSnd[idx++] = (byte) (val & 0x00ff);
                generatedSnd[idx++] = (byte) ((val & 0xff00) >> 8);
            }

            var track = new AudioTrack (global::Android.Media.Stream.Music, sampleRate, ChannelOut.Mono, Encoding.Pcm16bit, numSamples, AudioTrackMode.Static);
            track.Write(generatedSnd, 0, numSamples);
            track.Play ();
        }