Xamarin 缓冲声音流可以';不能播放wav文件

Xamarin 缓冲声音流可以';不能播放wav文件,xamarin,urhosharp,urho3d,Xamarin,Urhosharp,Urho3d,我正在为我的鼓类制作一个应用程序,为了使它跨平台,我选择了Urho.Sharp,因为它有低级的声音API和丰富的图形功能 作为第一步,我正在制作一个节拍器应用程序,为此,我正在使用BufferedSoundStream在此处添加音频,然后需要静音,如下所述: 但产生的声音根本不是声音,就像进入缓冲流的随机比特一样 这是我的代码: /// ///此代码初始化声音子系统 /// void CreateSound() { //声源需要一个节点,以便将其视为已启用 node=新节点(); SoundSo

我正在为我的鼓类制作一个应用程序,为了使它跨平台,我选择了Urho.Sharp,因为它有低级的声音API和丰富的图形功能

作为第一步,我正在制作一个节拍器应用程序,为此,我正在使用BufferedSoundStream在此处添加音频,然后需要静音,如下所述:

但产生的声音根本不是声音,就像进入缓冲流的随机比特一样

这是我的代码:

///
///此代码初始化声音子系统
///
void CreateSound()
{
//声源需要一个节点,以便将其视为已启用
node=新节点();
SoundSource=node.CreateComponent();
soundStream=新的BufferedSoundStream();
//设置格式:44100赫兹,16位,立体声
SetFormat(44100,true,true);
//开始播放。流中还没有数据,但是
SoundSource将等待,直到有数据,
//因为流默认处于“结束时不停止”模式
来源:播放(声音流);
}
///
///此代码预加载所有声音资源
///
只读词典声音映射=新建词典
{
{PointSoundType.beat,“wav/beat.wav”},
{PointSoundType.click,“wav/click.wav”},
{PointSoundType.click_accent,“wav/click_accent.wav”},
{PointSoundType.crash,“wav/crash.wav”},
{PointSoundType.foot_hh,“wav/foot_hh.wav”},
{PointSoundType.hh,“wav/hh.wav”},
{PointSoundType.open_hh,“wav/open_hh.wav”},
{PointSoundType.ride,“wav/ride.wav”},
{PointSoundType.snare,“wav/snare.wav”},
{PointSoundType.tom_1,“wav/tom_1.wav”},
{PointSoundType.tom_2,“wav/tom_2.wav”},
};
Dictionary SoundCache=新建字典();
私有资源()
{
//预加载所有声音
foreach(声音映射中的var s)
{
SoundCache[s.Key]=ResourceCache.GetSound(s.Value);
Debug.WriteLine(“加载的资源:“+s.Value+”,length=“+SoundCache[s.Key].length”);
}
}
///
///此代码用音频填充流
///
私有void UpdateSound()
{
//尽量在缓冲区中保留1/10秒的声音,以避免丢失和不必要的延迟
//浮动目标长度=1.0f/10.0f;
//将缓冲区临时增加到1s
浮动目标长度=1.0f;
float requiredLength=目标长度-soundStream.BufferLength;
如果(所需长度<0.0f)
返回;
uint numSamples=(uint)(soundStream.Frequency*所需长度);
//检查流是否仍然满
如果(numSamples==0)
返回;
var silencePause=新的短路[44100];
//迭代并播放所有声音
SoundCache.All(s=>
{
soundStream.AddData(s.Value.Handle、s.Value.DataSize);
//加上沉默
soundStream.AddData(沉默空间,0,沉默空间.Length);
返回true;
});
}

确保wav文件位于资源缓存中。然后不要播放BufferedSoundStream,而是播放Urho.Audio.Sound声音。这只是对同一方法Urho.Audio.SoundSource.Play()的不同重写,但它可以工作

    int PlaySound(string sSound)
    {
        var cache = Application.Current.ResourceCache;
        Urho.Audio.Sound sound = cache.GetSound(sSound);
        if (sound != null)
        {
            Node soundNode = scene.CreateChild("Sound");
            Urho.Audio.SoundSource soundSource = soundNode.CreateComponent<Urho.Audio.SoundSource>();
            soundSource.Play(sound);
            soundSource.Gain = 0.99f;
            return 1;
        }
        return 0;
    }
祝你好运

public float fRun = 0.0f;
public int iRet = 0;         // keep counting the played sounds
public override void OnUpdate(float timeStep)
{
    fRun = fRun + timeStep;
    int iMS = (int)(10f * fRun);  // tenth of seconds 
    if (iMS == 100) iRet = iRet + PlaySound("wav/hh.wav");
    if (iMS == 120) iRet = iRet + PlaySound("wav/hh.wav");
    if (iMS == 140) iRet = iRet + PlaySound("wav/hh.wav"); 
    if (iMS == 160) iRet = iRet + PlaySound("wav/open_hh.wav"); 
    if (iMS >= 160) fRun = 0.8f;
}