Android上SoundPool的奇怪错误

时间:2015-06-17 18:01:55

标签: java android

我的Android App中的SoundPool出现问题。

直到我使用Soundpool的play()方法中的参数进行播放之前,所有人都找到了。我已将播放速率设置为2f并收到此警告:

06-17 19:53:13.359: W/AudioTrack(11526): AUDIO_OUTPUT_FLAG_FAST denied by client

将它再次设置为1f后,我现在收到了这些错误:

06-17 19:53:13.359: W/AudioTrack(11526): AUDIO_OUTPUT_FLAG_FAST denied by client
06-17 19:53:13.359: E/AudioTrack(11526): AudioFlinger could not create track, status: -12
06-17 19:53:13.359: E/SoundPool(11526): Error creating AudioTrack

这一切都发生在我使用Android L的Samsung Note 4和Eclipse中。 在我的三星s3上它运行正常但是我没有通过USB安装应用程序,而速率仍设置为2f。

这里是所有必要的代码:

设置声音池

public void setUpSounds()
{
    soundPool=new SoundPool(20,AudioManager.STREAM_MUSIC,0);
    soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener()
    {
        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId,int status)
        {
            if(sampleId==beepID)
            {
                if(status==0)
                {
                    beepLoaded=true;
                }
            }
            else if(sampleId==buttonClickID)
            {
                if(status==0)
                {
                    buttonClickLoaded=true;
                }
            }
            else if(sampleId==menuEnterID)
            {
                if(status==0)
                {
                    menuEnterLoaded=true;
                }
            }
            else if(sampleId==menuExitID)
            {
                if(status==0)
                {
                    menuExitLoaded=true;
                }
            }
        }

    });
    buttonClickID=soundPool.load(this,R.raw.buttonclick, 0);
    beepID=soundPool.load(this, R.raw.beep,0);
    menuEnterID=soundPool.load(this, R.raw.menuenter,0);
    menuExitID=soundPool.load(this, R.raw.menuexit,0);
}
播放声音:

/**
 * play the menu exit sound
 */
public void playMenuExitSound()
{
    if(soundFXOn&&mAct.menuExitLoaded)
    {
        mAct.soundPool.play(mAct.menuExitID, 0.2f, 0.2f, 0, 0, 1.0f);
    }
}


/**
 * play the menu entered sound
 */
public void playMenuEnterSound()
{
    if(soundFXOn&&mAct.menuEnterLoaded)
    {
        mAct.soundPool.play(mAct.menuEnterID, 0.2f, 0.2f, 0, 0, 1.0f);
    }
}


/**
 * plays the button click sound
 */
public void playButtonClick()
{
    if(soundFXOn&&mAct.buttonClickLoaded)
    {
        mAct.soundPool.play(mAct.buttonClickID, 1f, 1f, 0, 0, 1.0f);
    }
}

线程内的哔哔声

if(mView.soundFXOn&&mView.mAct.beepLoaded)
                {
                    mView.mAct.soundPool.play(mView.mAct.beepID, 0.05f, 0.05f, 0, 0, 1);
                }

我只是看不出有什么问题,它必须在我的笔记内部,不再发出声音!

或者Eclipse中的某些内容完全错误,因此它会发送错误的标记或者像那样

1 个答案:

答案 0 :(得分:3)

Android正在拒绝该标志,然后由于从SoundPool中删除该标志而导致后续错误消息。生命中的错误是你应该密切关注的错误。

根据您在错误消息上运行软件的Android版本可能是特定的或通用的(您的看似通用)。但是您收到的错误通常是由于设备硬件和声音池之间的采样率不匹配。其他一些原因可能是: 影响决策的因素包括:

  • 此输出存在快速混音器线程(见下文)
  • 跟踪采样率
  • 存在客户端线程以执行此轨道的回调处理程序
  • 跟踪缓冲区大小
  • 可用的快速通道插槽(见下文)

两种可能的解决方案: 首先尝试使用AudioManager.getProperty(PROPERTY_OUTPUT_SAMPLE_RATE)提供的采样率。否则你的缓冲区会绕过系统重采样器。

或尝试通过Builder设置SoundPool并手动设置所有属性,如下所示:

AudioAttributes attributes = new AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
                .setUsage(AudioAttributes.USAGE_GAME)
                .build();
        pool = new SoundPool.Builder().setAudioAttributes(attributes).setMaxStreams(2).build()

这是我试图解决同一问题的所有页面的杂项。

https://code.google.com/p/android/issues/detail?id=160879 AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client due to mismatching sample rate https://code.google.com/p/android/issues/detail?id=58113