am 7d987180: Merge change I19f2928b into eclair

Merge commit '7d9871805beef4ea5e319f1a11ab32f610031845' into eclair-plus-aosp

* commit '7d9871805beef4ea5e319f1a11ab32f610031845':
  Fix issue 2141503: Keyclick sound doesn't honor volume settings.
This commit is contained in:
Eric Laurent
2009-09-29 15:18:10 -07:00
committed by Android Git Automerger
2 changed files with 23 additions and 6 deletions

View File

@@ -1063,7 +1063,9 @@ public class AudioManager {
* {@link #FX_KEYPRESS_SPACEBAR}, * {@link #FX_KEYPRESS_SPACEBAR},
* {@link #FX_KEYPRESS_DELETE}, * {@link #FX_KEYPRESS_DELETE},
* {@link #FX_KEYPRESS_RETURN}, * {@link #FX_KEYPRESS_RETURN},
* @param volume Sound effect volume * @param volume Sound effect volume.
* The volume value is a raw scalar so UI controls should be scaled logarithmically.
* If a volume of -1 is specified, the AudioManager.STREAM_MUSIC stream volume minus 3dB will be used.
* NOTE: This version is for applications that have their own * NOTE: This version is for applications that have their own
* settings panel for enabling and controlling volume. * settings panel for enabling and controlling volume.
*/ */

View File

@@ -619,11 +619,12 @@ public class AudioService extends IAudioService.Stub {
/** @see AudioManager#playSoundEffect(int) */ /** @see AudioManager#playSoundEffect(int) */
public void playSoundEffect(int effectType) { public void playSoundEffect(int effectType) {
sendMsg(mAudioHandler, MSG_PLAY_SOUND_EFFECT, SHARED_MSG, SENDMSG_NOOP, sendMsg(mAudioHandler, MSG_PLAY_SOUND_EFFECT, SHARED_MSG, SENDMSG_NOOP,
effectType, SOUND_EFFECT_VOLUME, null, 0); effectType, -1, null, 0);
} }
/** @see AudioManager#playSoundEffect(int, float) */ /** @see AudioManager#playSoundEffect(int, float) */
public void playSoundEffectVolume(int effectType, float volume) { public void playSoundEffectVolume(int effectType, float volume) {
loadSoundEffects();
sendMsg(mAudioHandler, MSG_PLAY_SOUND_EFFECT, SHARED_MSG, SENDMSG_NOOP, sendMsg(mAudioHandler, MSG_PLAY_SOUND_EFFECT, SHARED_MSG, SENDMSG_NOOP,
effectType, (int) (volume * 1000), null, 0); effectType, (int) (volume * 1000), null, 0);
} }
@@ -634,6 +635,9 @@ public class AudioService extends IAudioService.Stub {
*/ */
public boolean loadSoundEffects() { public boolean loadSoundEffects() {
synchronized (mSoundEffectsLock) { synchronized (mSoundEffectsLock) {
if (mSoundPool != null) {
return true;
}
mSoundPool = new SoundPool(NUM_SOUNDPOOL_CHANNELS, AudioSystem.STREAM_SYSTEM, 0); mSoundPool = new SoundPool(NUM_SOUNDPOOL_CHANNELS, AudioSystem.STREAM_SYSTEM, 0);
if (mSoundPool == null) { if (mSoundPool == null) {
return false; return false;
@@ -1197,10 +1201,20 @@ public class AudioService extends IAudioService.Stub {
if (mSoundPool == null) { if (mSoundPool == null) {
return; return;
} }
float volFloat;
// use STREAM_MUSIC volume attenuated by 3 dB if volume is not specified by caller
if (volume < 0) {
// Same linear to log conversion as in native AudioSystem::linearToLog() (AudioSystem.cpp)
float dBPerStep = (float)((0.5 * 100) / MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]);
int musicVolIndex = (mStreamStates[AudioSystem.STREAM_MUSIC].mIndex + 5) / 10;
float musicVoldB = dBPerStep * (musicVolIndex - MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]);
volFloat = (float)Math.pow(10, (musicVoldB - 3)/20);
} else {
volFloat = (float) volume / 1000.0f;
}
if (SOUND_EFFECT_FILES_MAP[effectType][1] > 0) { if (SOUND_EFFECT_FILES_MAP[effectType][1] > 0) {
float v = (float) volume / 1000.0f; mSoundPool.play(SOUND_EFFECT_FILES_MAP[effectType][1], volFloat, volFloat, 0, 0, 1.0f);
mSoundPool.play(SOUND_EFFECT_FILES_MAP[effectType][1], v, v, 0, 0, 1.0f);
} else { } else {
MediaPlayer mediaPlayer = new MediaPlayer(); MediaPlayer mediaPlayer = new MediaPlayer();
if (mediaPlayer != null) { if (mediaPlayer != null) {
@@ -1209,6 +1223,7 @@ public class AudioService extends IAudioService.Stub {
mediaPlayer.setDataSource(filePath); mediaPlayer.setDataSource(filePath);
mediaPlayer.setAudioStreamType(AudioSystem.STREAM_SYSTEM); mediaPlayer.setAudioStreamType(AudioSystem.STREAM_SYSTEM);
mediaPlayer.prepare(); mediaPlayer.prepare();
mediaPlayer.setVolume(volFloat, volFloat);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() { mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) { public void onCompletion(MediaPlayer mp) {
cleanupPlayer(mp); cleanupPlayer(mp);