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);
}
}