CSCore падает, когда "soundOut.Play" вызывается изнутри Unity

При попытке воспроизвести звук с CSCore, загруженным в проект Unity3D, редактор закрывается.

        IWaveSource audio = CodecFactory.Instance.GetCodec(pathToMP3File);
        ISoundOut device = new WasapiOut();
        device.Initialize(audio);

        device.Play(); // the call causing the crash

Какой выход я выберу (WasapiOut, DirectSoundOut, WaveOut) не меняет результат.


CSCore.dll был скомпилирован с целевым параметром "Unity 3.5 .net Full Base Class Libraries" в VS 2015. Это полный скрипт:

using UnityEngine;

using CSCore;
using CSCore.Codecs;
using CSCore.SoundOut;
using System.Threading;

public class CScorePlayback : MonoBehaviour {

    static string testAudio = "C:/Path/to/audio.mp3";

    IWaveSource audioSource;
    ISoundOut audioDevice;
    Thread audioThread;

    void Start () {
        audioThread = new Thread(PlaySoundTest);
        audioThread.Start();
    }

    void PlaySoundTest()
    {
        audioSource = CodecFactory.Instance.GetCodec(testAudio);
        audioDevice = new WaveOut();
        audioDevice.Initialize(audioSource);

        try
        {
            audioDevice.Play();
            Debug.Log("Sound Played!");
        }
        catch (System.Exception e)
        {
            Debug.Log("Error playing sound: " + e.Message);
        }
    }

    void OnDestroy()
    {
        if (audioThread != null) audioThread.Join();
        if (audioDevice != null)
        {
            audioDevice.Dispose();
        }
        if (audioSource != null)
        {
            audioSource.Dispose();
        }
    }
}

1 ответ

Первое, что я бы предложил вам сделать, это поставить Play() функция, которая вылетает в блоке try catch.

void Start()
{

    IWaveSource audio = CodecFactory.Instance.GetCodec(pathToMP3File);
    ISoundOut device = new WasapiOut();
    device.Initialize(audio);

    try
    {
        device.Play(); // the call causing the crash
        Debug.Log("Sound Played!");
    }
    catch (System.Exception e)
    {
        Debug.Log("Error playing sound: " + e.Message);
    }
}

Если происходит сбой, посмотрите, пожалуйста, проверьте, распечатано ли там сообщение. Отредактируйте свой вопрос и опубликуйте сообщение об ошибке.

Теперь также попробуйте вызвать всю функцию в другом потоке, чтобы убедиться, что это не проблема. Дайте мне знать, что происходит в обоих случаях.

void Start()
{
    playSound();
}

void playSound()
{
    new System.Threading.Thread(___playSound)
    {

    }.Start();
}

void ___playSound()
{

    IWaveSource audio = CodecFactory.Instance.GetCodec(pathToMP3File);
    ISoundOut device = new WasapiOut();
    device.Initialize(audio);

    try
    {
        device.Play(); // the call causing the crash
        Debug.Log("Sound Played!");
    }
    catch (System.Exception e)
    {
        Debug.Log("Error playing sound: " + e.Message);
    }
}
Другие вопросы по тегам