Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin窗体异步播放声音_C#_Audio_Xamarin_Xamarin.ios_Task - Fatal编程技术网

C# Xamarin窗体异步播放声音

C# Xamarin窗体异步播放声音,c#,audio,xamarin,xamarin.ios,task,C#,Audio,Xamarin,Xamarin.ios,Task,我可以使用Xamarin表单(Android和iOS)成功播放声音,但我还需要实现以下目标: 我需要等待,这样,如果多个声音被“播放”,一个将在下一个之前完成 我需要返回一个布尔值来指示操作是否成功 以下是我当前的简化代码(适用于iOS平台): 我曾希望听到的音频文件1,然后文件2,然后文件3。然而,我只听到文件1,代码似乎没有到达第二个等待 谢谢我想你这里的问题是,AVAudioPlayer\u播放器在完成之前就被清除了。如果要将调试添加到FinsihedPlaying,您会注意到您从未达

我可以使用Xamarin表单(Android和iOS)成功播放声音,但我还需要实现以下目标:

  • 我需要等待,这样,如果多个声音被“播放”,一个将在下一个之前完成
  • 我需要返回一个布尔值来指示操作是否成功
以下是我当前的简化代码(适用于iOS平台):

我曾希望听到的音频文件1,然后文件2,然后文件3。然而,我只听到文件1,代码似乎没有到达第二个等待


谢谢

我想你这里的问题是,
AVAudioPlayer\u播放器
在完成之前就被清除了。如果要将调试添加到
FinsihedPlaying
,您会注意到您从未达到这一点

尝试一下这些更改,我制作了一个私有的
AVAudioPlayer
来坐在
任务之外

(我使用以下指南作为参考)

public异步void play()
{
系统。诊断。调试。写入线(“播放1”);
等待播放音频任务(“wave2.wav”);
系统.诊断.调试.写入线(“播放2”);
等待播放音频任务(“wave2.wav”);
系统。诊断。调试。写入线(“播放3”);
等待播放音频任务(“wave2.wav”);
}
私人AVAudioPlayer播放器;//将玩家置于任务之外
公共任务PlayAudioTask(字符串文件名)
{
var tcs=new TaskCompletionSource();
//有声音播放吗?
如果(玩家!=null)
{
//停止并处理任何声音
player.Stop();
player.Dispose();
}
字符串filePath=NSBundle.MainBundle.PathForResource(
Path.GetFileNameWithoutExtension(文件名),Path.GetExtension(文件名));
var url=NSUrl.FromString(文件路径);
player=AVAudioPlayer.FromUrl(url);
player.FinishedPlaying+=(对象发送者,AVStatusEventArgs e)=>
{
System.Diagnostics.Debug.WriteLine(“完成播放”);
player=null;
tcs.SetResult(真);
};
player.NumberOfLoops=0;
System.Diagnostics.Debug.WriteLine(“开始播放”);
player.Play();
返回tcs.Task;
}

我想你这里的问题是
AVAudioPlayer\u播放器在完成之前就被清除了。如果要将调试添加到
FinsihedPlaying
,您会注意到您从未达到这一点

尝试一下这些更改,我制作了一个私有的
AVAudioPlayer
来坐在
任务之外

(我使用以下指南作为参考)

public异步void play()
{
系统。诊断。调试。写入线(“播放1”);
等待播放音频任务(“wave2.wav”);
系统.诊断.调试.写入线(“播放2”);
等待播放音频任务(“wave2.wav”);
系统。诊断。调试。写入线(“播放3”);
等待播放音频任务(“wave2.wav”);
}
私人AVAudioPlayer播放器;//将玩家置于任务之外
公共任务PlayAudioTask(字符串文件名)
{
var tcs=new TaskCompletionSource();
//有声音播放吗?
如果(玩家!=null)
{
//停止并处理任何声音
player.Stop();
player.Dispose();
}
字符串filePath=NSBundle.MainBundle.PathForResource(
Path.GetFileNameWithoutExtension(文件名),Path.GetExtension(文件名));
var url=NSUrl.FromString(文件路径);
player=AVAudioPlayer.FromUrl(url);
player.FinishedPlaying+=(对象发送者,AVStatusEventArgs e)=>
{
System.Diagnostics.Debug.WriteLine(“完成播放”);
player=null;
tcs.SetResult(真);
};
player.NumberOfLoops=0;
System.Diagnostics.Debug.WriteLine(“开始播放”);
player.Play();
返回tcs.Task;
}

苹果的AVAudioPlayer参考-Xamarin-使用AVAudioPlayer播放声音-苹果的AVAudioPlayer参考-Xamarin-使用AVAudioPlayer播放声音-
    public Task<bool> PlayAudioTask(string fileName)
    {
        var tcs = new TaskCompletionSource<bool>();

        string filePath = NSBundle.MainBundle.PathForResource(
                Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName));

        var url = NSUrl.FromString(filePath);

        var _player = AVAudioPlayer.FromUrl(url);

        _player.FinishedPlaying += (object sender, AVStatusEventArgs e) =>
            {
                _player = null;
                tcs.SetResult(true);
            };

        _player.Play();

        return tcs.Task;
    }
    var res1 = await _audioService.PlayAudioTask("file1");
    var res2 = await _audioService.PlayAudioTask("file2");
    var res3 = await _audioService.PlayAudioTask("file3");
    public async void play()
    {

        System.Diagnostics.Debug.WriteLine("Play 1");
        await PlayAudioTask("wave2.wav");

        System.Diagnostics.Debug.WriteLine("Play 2");
        await PlayAudioTask("wave2.wav");

        System.Diagnostics.Debug.WriteLine("Play 3");
        await PlayAudioTask("wave2.wav");

    }


    private AVAudioPlayer player;  // Leave the player outside the Task

    public Task<bool> PlayAudioTask(string fileName)
    {
        var tcs = new TaskCompletionSource<bool>();

        // Any existing sound playing?
        if (player != null)
        {
            //Stop and dispose of any sound
            player.Stop();
            player.Dispose();
        }

        string filePath = NSBundle.MainBundle.PathForResource(
                Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName));

        var url = NSUrl.FromString(filePath);

        player = AVAudioPlayer.FromUrl(url);

        player.FinishedPlaying += (object sender, AVStatusEventArgs e) =>
        {
            System.Diagnostics.Debug.WriteLine("DONE PLAYING");
            player = null;
            tcs.SetResult(true);
        };


        player.NumberOfLoops = 0;
        System.Diagnostics.Debug.WriteLine("Start Playing");
        player.Play();

        return tcs.Task;
    }