2-й звук играет с меньшей целостностью?

Я хочу нажать кнопку на гарнитуре, воспроизвести звук через громкую связь, а затем записать 10-секундный аудиоклип. Вот мой код:

        SoundPool soundPool;
        HashMap<Integer, Integer> soundPoolMap;
        soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
        soundPoolMap = new HashMap<Integer, Integer>();
        soundPoolMap.put(SOUND_RECORD_ON,
                soundPool.load(context, R.raw.on, 1));
        soundPoolMap.put(SOUND_RECORD_OFF,
                soundPool.load(context, R.raw.off, 1));

        AudioManager mAudioManager = (AudioManager) context
                .getSystemService(Context.AUDIO_SERVICE);
        float streamVolumeMax = mAudioManager
                .getStreamMaxVolume(AudioManager.STREAM_MUSIC);

        if (recordStarted == false) {
            try { // start recording
                audioRecorder.start();
                recordStarted = true;
                System.out.println(String.format("recording: %s",
                        recordStarted));

                mAudioManager.setMode(AudioManager.MODE_IN_CALL);
                mAudioManager.setSpeakerphoneOn(true);
                System.out.println("speaker on");
                soundPool.play(soundPoolMap.get(SOUND_RECORD_ON),
                        streamVolumeMax, streamVolumeMax, 1, 0, 1f);

            } catch (IOException e) {
                e.printStackTrace();
            }
        } else { // stop recording
            try {
                audioRecorder.stop();
                recordStarted = false;
                System.out.println(String.format("recording: %s",
                        recordStarted));

                mAudioManager.setMode(AudioManager.MODE_IN_CALL);
                mAudioManager.setSpeakerphoneOn(true);
                System.out.println("speaker on");
                soundPool.play(soundPoolMap.get(SOUND_RECORD_ON),
                        streamVolumeMax, streamVolumeMax, 2, 0, 1f);

            } catch (IOException e) {
                e.printStackTrace();
            }

Первый звук воспроизводится на динамике нормально, с очень хорошей целостностью. Однако, когда я снова нажимаю кнопку, чтобы остановить запись, звук почти не слышен, несмотря на использование того же клипа. Вот след logcat:

ERROR/MediaButtonIntentReceiver(5290): <!> MediaButtonIntentReceiver 52<!> BUTTON PRESSED :D 
WARN/StagefrightRecorder(1466): Target duration (10000000 us) too short to be respected
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=2,mCurSndDevice=-1
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(2, 1, 0)
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=2,mCurSndDevice=2
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=2,mCurSndDevice=2
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=2,mCurSndDevice=-1
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(2, 1, 0)
INFO/System.out(5290): recording: true
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): Routing audio to Speakerphone_conversation
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=7,mCurSndDevice=-1
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(7, 0, 0)
ERROR/AudioService(1586): <!>android.media.AudioService 895<!> [BTUI] [SCO] ### setMode (2)
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): Routing audio to Speakerphone_conversation
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=7,mCurSndDevice=7
INFO/System.out(5290): speaker on
WARN/AudioFlinger(1466): write blocked for 138 msecs, 71 delayed writes, thread 0xce08
ERROR/SUMAN-statusbarpolicy(1665): <!>com.android.systemui.statusbar.policy.StatusBarPolicy 1069<!> mServiceState.getRoaming()false
DEBUG/StatusBarPolicy(1665): [BRIGHTHY] 0. mDataNetType: 8
DEBUG/StatusBarPolicy(1665): [BRIGHTHY] curNetwork=302880 curHPLMN=302220
WARN/KeyCharacterMap(5290): No keyboard for id 0
WARN/KeyCharacterMap(5290): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
ERROR/MediaButtonIntentReceiver(5290): <!> MediaButtonIntentReceiver 52<!> BUTTON PRESSED :D 
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=2,mCurSndDevice=-1
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(2, 0, 0)
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): Routing audio to Speakerphone_conversation
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=7,mCurSndDevice=2
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(7, 0, 0)
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): Routing audio to Speakerphone_conversation
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=7,mCurSndDevice=-1
ERROR/AudioHardwareMSM72XX(1466): [SKW]do_route_audio_rpc(7, 0, 0)
INFO/System.out(5290): recording: false
ERROR/AudioHardwareMSM72XX(1466): [LGE] output devices :2
ERROR/AudioHardwareMSM72XX(1466): Routing audio to Speakerphone_conversation
ERROR/AudioHardwareMSM72XX(1466): [doRouting]new_snd_device=7,mCurSndDevice=7
INFO/System.out(5290): speaker on

Кто-нибудь знает, почему это так? Я знаю, что в первой части я не установил громкую связь на спикер; если я это сделаю, звук будет воспроизводиться только через гарнитуру. Я подозреваю, что это строка, которая говорит "слишком короткая, чтобы ее уважать". Большое спасибо!

--------- ОБНОВЛЕНИЕ С КОДАМИ MEDIAPLAYER -------------

    if (action == KeyEvent.ACTION_DOWN) {
        Log.e(TAG, "BUTTON PRESSED :D ");

        AudioManager mAudioManager = (AudioManager) context
                .getSystemService(Context.AUDIO_SERVICE);
        MediaPlayer playOn = MediaPlayer.create(context, R.raw.on);

        if (recordStarted == false) {
            try { // start recording

                audioRecorder.start();
                recordStarted = true;
                System.out.println(String.format("recording: %s",
                        recordStarted));

                mAudioManager.setMode(AudioManager.MODE_IN_CALL);
                mAudioManager.setSpeakerphoneOn(true);
                System.out.println("speaker on");

                playOn.start();
                System.out.println("playing on tune");

            } catch (IOException e) {
                e.printStackTrace();
            }
        } else { // stop recording
            try {
                audioRecorder.stop();
                recordStarted = false;
                System.out.println(String.format("recording: %s",
                        recordStarted));

                playOn.start();
                System.out.println("playing off tune");

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // mAudioManager.setSpeakerphoneOn(false);
                // System.out.println("speaker off");
                // mAudioManager.setMode(AudioManager.MODE_NORMAL);
            }
        } // end else
    } // end key down action

Хорошо, использовал этот код для воспроизведения звука, но 2-й звук все еще очень тихий (та же проблема, что и раньше)... больше предложений?:D

1 ответ

Оказывается, я не должен был воспроизводить музыку в BroadcastReceiver (обнаруживает кнопку мультимедиа), потому что музыка будет длиться только до тех пор, пока выполняется onReceive. Таким образом, служба должна была быть создана для воспроизведения перед записью.

Другие вопросы по тегам