当前位置: 首页 > 知识库问答 >
问题:

偶尔,与ScheduledExecutorService一起使用的Android SoundPool会停止播放声音

祁博涛
2023-03-14

在我的手机和模拟器上,这似乎发生了15次中的1次。音响池将播放声音约3秒,然后停止。当我播放声音时,我反复得到这个消息,我理解这只是意味着不能使用低延迟模式。当声音停止时,不再产生这些警告。

    W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client
    07-09 22:14:15.630 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7935
    07-09 22:14:15.630 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7928
    07-09 22:14:15.750 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7936
    07-09 22:14:15.750 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7937
    07-09 22:14:15.870 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7938
    07-09 22:14:16.130 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7939
    07-09 22:14:16.130 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7940
    07-09 22:14:16.250 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7941
    07-09 22:14:16.390 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7943
    07-09 22:14:16.390 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7944
    07-09 22:14:17.620 2601-2890/? I/AudioPolicyManager: stopOutput() output 2, stream 7, session 7942
    07-09 22:14:17.620 2601-2890/? I/AudioPolicyManager: getNewOutputDevice() selected device 0
    07-09 22:14:17.620 2601-2890/? I/AudioPolicyManager: setOutputDevice() output 2 device 0x0000 delayMs 40
    07-09 22:14:17.620 2601-2890/? I/AudioPolicyManager: setOutputDevice() prevDevice 0x0002
    07-09 22:14:17.620 2601-2890/? I/AudioPolicyManager: setOutputDevice() setting same device 0x0000 or null device for output 2
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        clips = new SoundPool.Builder()
                .setMaxStreams(22)
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
                        .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
                        .build())
                .build();
    } else {
        clips = new SoundPool(22, AudioManager.STREAM_ALARM, 0);
    }
ScheduledExecutorService trigger = Executors.newScheduledThreadPool(3);
int e1 = clips.load(this, noteFiles.getResourceId(0,0), 1);
int[] noteIDs = {e1};

playNote = new Runnable() {
        public void run() {
        clips.play(noteIDs[0], realTuneVol, realTuneVol, 1, 0, 1);
}
}

clips.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
          if (savedInstanceState != null) {
               trigger.shutdown();
           } else {
               trigger.scheduleAtFixedRate(playNote, 0, 125, TimeUnit.MILLISECONDS);
                    }
                }
            }
        }
    });

我同时播放了很多片段,所以我明白这可能是一个问题,但我没有注意到播放的片段数量和这个错误之间的关系。然而,我读到和体验到的是,如果我试图播放太多的片段,声音池会开始跳过它们,但它不会一起停止。因此,我想知道这个问题是否与我试图播放的剪辑数量无关,而实际上与ScheduleDExecutorService有关。当声音停止时,Runnable似乎不再执行,因为我没有从它收到新的日志消息。非常感谢任何帮助。

共有1个答案

夏星阑
2023-03-14

正如这里提到的,ScheduledExecutorService会抑制异常。http://code.nomad-labs.com/2011/12/09/moth-fk-the-scheduledexecutorservice/

因此,通过将整个Runnable包装在try catch块中,我能够发现ArrayIndexOutOfBoundsException有时是由于程序的另一部分而发生的,从而导致了问题。

playNote = new Runnable() {
    public void run() {
    try{
    clips.play(noteIDs[0], realTuneVol, realTuneVol, 1, 0, 1);
    }
    catch (Throwable th){
        Log.v("ErrorInRunnable", th.toString());
    }
    }
}
 类似资料:
  • 如何在曲目播放期间添加CSS类“playSound”?

  • 我正在尝试用js制作一架简单的钢琴,但我不想使用音频样本,而是想以编程方式生成声音。要播放单个声音,我正在使用此博客中的此代码 https://marcgg.com/blog/2016/11/01/javascript-audio/ 我发现在玩了大约50次之后,这种方法停止工作。运行此代码时不播放声音, 不会更改并保持 0。如何在不停止播放声音的情况下修复它?

  • 当类初始化时,我试图播放铃声,并使用滑块按钮关闭。播放器在初始化时成功创建,但由于某些原因,由于以下错误,无法使用滑块按钮关闭它。 E/flutter(6529):[ERROR: flutter/lib/ui/ui_dart_state.cc(166)]未处理的异常:缺少插件异常(未找到实现方法hasVibrator对通道振动)E/flutter(6529):#0方法通道。_invokeMetho

  • 问题内容: 该程序在九次打印后完成: 如何停止进程(例如eclipse中的Java进程),因为它在9秒的时间限制后没有停止? 问题答案: 您遇到的问题是,取消哔声任务后,调度程序会保留活动线程。 如果存在活动的非守护程序线程,则JVM保持活动状态。 它使该线程保持不变的原因是您已在此行中告诉它这样做: 请注意以下文档: -即使在空闲状态下要保留在池中的线​​程数。 因此,您有两种可能的方法来导致J

  • 问题内容: 我正在尝试在游戏中一次播放两个波形声音(背景音乐和效果)。我首先使用Java中的另一个音频处理程序构造了这段代码,该处理程序将处理声音的播放,停止和循环。这种构造只会播放背景音乐或效果,但一次只能播放一次。我环顾互联网,并被告知使用javax.sound.sampled.Clip处理声音,因此重用了相同的构造(播放,停止,循环),但将其切换为使用javax.sound.sampled.

  • ap.stopBackgroundAudio(CALLBACK) 停止播放音乐。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <style>.output{ display:block; max-width: 100%;