我有一个非常奇怪的问题,我无法弄清楚。我有一个用单一声音(非常短的“点击”声音)初始化的声音池。在我的活动按钮的 onClick 处理程序中,我做了一个简单的操作SoundManager.playSound(1, 0);
,它在哈希图中查找声音并播放声音。每次点击都使用完全相同的playSound调用。它总是播放声音并且没有出错。
这是有趣的部分。点击声音的音量随着按钮按下而变化。我可以按一次,它听起来很微弱。我回击然后再次按下它,它听起来很响亮。我找不到任何押韵或理由。我想可能是因为负载而搞砸了(我知道这很疯狂,但我在这里不知所措)所以我什至在一个单独的线程中开始了声音。结果还是一样。我想可能是由于第二次初始化声音管理器,所以我添加了一个检查以确保不会发生这种情况......结果相同。
我使用了一个声音管理器类,我在网上找到了几个地方。它在下面。
public class SoundManager
{
static private SoundManager _instance;
private static SoundPool mSoundPool;
private static HashMap<Integer, Integer> mSoundPoolMap;
private static AudioManager mAudioManager;
private static Context mContext;
public static boolean isInitialized = false;
private SoundManager()
{
}
/**
* Requests the instance of the Sound Manager and creates it if it does not exist.
*
* @return Returns the single instance of the SoundManager
*/
static synchronized public SoundManager getInstance()
{
if (_instance == null) _instance = new SoundManager();
return _instance;
}
/**
* Initialises the storage for the sounds
*
* @param theContext
* The Application context
*/
@SuppressLint("UseSparseArrays")
public static void initSounds(Context theContext)
{
mContext = theContext;
mSoundPool = new SoundPool(4, AudioManager.STREAM_NOTIFICATION, 0);
mSoundPoolMap = new HashMap<Integer, Integer>();
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
}
/**
* Add a new Sound to the SoundPool
*
* @param Index
* - The Sound Index for Retrieval
* @param SoundID
* - The Android ID for the Sound asset.
*/
public static void addSound(int Index, int SoundID)
{
mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));
}
/**
* Loads the various sound assets Currently hardcoded but could easily be changed to be flexible.
*/
public static void loadSounds()
{
if (!isInitialized)
{
mSoundPoolMap.put(1, mSoundPool.load(mContext, R.raw.click, 1));
isInitialized = true;
}
}
/**
* Plays a Sound
*
* @param index
* - The Index of the Sound to be played
* @param speed
* - The Speed to play not, not currently used but included for compatibility
*/
public static void playSound(int index, float speed)
{
float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION);
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION);
mSoundPool.play(mSoundPoolMap.get(index), 1, 1, 1, 0, speed);
}
/**
* Stop a Sound
*
* @param index
* - index of the sound to be stopped
*/
public static void stopSound(int index)
{
mSoundPool.stop(mSoundPoolMap.get(index));
}
/**
* Deallocates the resources and Instance of SoundManager
*/
public static void cleanup()
{
mSoundPool.release();
mSoundPool = null;
mSoundPoolMap.clear();
mAudioManager.unloadSoundEffects();
_instance = null;
}
}
您可以在PlaySound方法中看到,我已将左右声道的音量硬编码为最大值 1。这没有帮助。声音的音量仍在波动。
我还更新了我正在使用的流,AudioManager.STREAM_NOTIFICATION
而不是AudioManager.STREAM_MUSIC
查看它是否与流相关。它似乎不是因为它表现出相同的行为。
我还将我的声音文件从一个转换OGG
为一个WAV
,看看是否有帮助。没变。
这是我正在使用的非常快速的“点击”,但在仔细聆听时,它听起来并不像是被切断了。并且正在播放完整的文件。
这可能与硬件有关吗?我使用的唯一测试设备是旧的 HTC Incredible。该硬件有任何已知问题吗?
再次......这件事有效,但有不同的音量很烦人,我就是不能放手。有没有其他人经历过这个?