How can I fix my audio? (Prioritize)

半城伤御伤魂 提交于 2020-02-08 01:29:26

问题


When two audio's are played at the same time...the sound is canceling out. How do I fix this weird phenomenon?

I have some code where there is audio on button click and audio in ten second intervals (in a background service). I have the following code to stop the button audio when the ten second interval plays, and it works fine:

public static void myPop(Context context){
    AudioManager manager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    if(!manager.isMusicActive()) {       //Only if there isn't any other audio playing
        MediaPlayer pop = MediaPlayer.create(context, R.raw.pop);
        pop.start();
    }
    else{
        Log.v(TAG, "Audio is already playing");
    }
}

This works fine, and it stops one audio from playing (pop) to let the other audio play(The one from the background service). Now, I am getting the issue when they both play at the same time. For example, when I tap the button at the exact same time as when the audio from the background service is about to start. when they are both played at the same time, the audio just gets cut off

Is there any way to give a preference to the background service audio? Somehow say that: If two audio pieces start at the exact same time, I want to let the background service audio to play.

To think of this visually:

(https://upload.wikimedia.org/wikipedia/en/4/49/Preference_example.jpg)

I want to say that if I have the choice between apples and oranges, pick apples. AKA If I have two audioplayers playing at the same time, pick one (the apple).

Thanks for your help,

Ruchir


回答1:


You may have a race condition. In these three lines

1    if(!manager.isMusicActive()) {
2        MediaPlayer pop = MediaPlayer.create(context, R.raw.pop);
3        pop.start();

Between line 1 and line 3, there is opportunity for another player to get the media player and start playing, especially if line 2 is slow.

I would suggest making one media player that both players access (i.e. create the "MediaPlayer pop" elsewhere and share it), or find another way to synchronize the different players. Perhaps issuing a stop right before a play, rather than checking for play state.




回答2:


You can use code for play or pause audio when other player start or pause.

   AudioManager.OnAudioFocusChangeListener afChangeListener =
    new AudioManager.OnAudioFocusChangeListener() {
        public void onAudioFocusChange(int focusChange) {
            if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT) {
                // Pause playback
            } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
                // Resume playback
            } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
                am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
                am.abandonAudioFocus(afChangeListener);
                // Stop playback
            }
        }
    };

For more referernce http://developer.android.com/training/managing-audio/audio-focus.html



来源:https://stackoverflow.com/questions/33908881/how-can-i-fix-my-audio-prioritize

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!