2011-09-28 5 views
0

헤드셋의 버튼을 누르고 스피커폰을 통해 사운드를 재생 한 다음 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

+0

실제로이 시나리오에서는 SoundPool을 사용할 시점이 없습니다. 사운드를 재생하려면 MediaPlayer를 사용하십시오. 훨씬 더 믿을만하고 똑바로. SoundPool은 게임이나 사운드의 과도한 사용에 필요한 최적화를위한 것입니다. – IncrediApp

+0

이제 "mediaplyer가 처리되지 않은 이벤트로 사라졌습니다."... 제 코드에 무엇이 잘못되었는지 보시겠습니까? – Lily

+0

ok nevermind, 너무 빨리 호출 된 "릴리스"인 것 같습니다. 이상한 일이지만, 리소스를 해제하기 전에 클립이 재생 완료 될 때까지 기다릴 것이라고 생각했습니다 ... – Lily

답변

1

음악이 onReceive가 실행되는 동안 만 지속되기 때문에 BroadcastReceiver에서 음악을 재생하지 않아야합니다 (미디어 버튼을 감지 함). 따라서 녹음하기 전에 재생할 서비스를 만들어야했습니다.