Android SoundPool以不同的音量播放声音

时间:2012-09-06 06:18:12

标签: android soundpool

我有一个非常奇怪的问题,我无法弄明白。我有一个声音池,用一个声音初始化(一个非常短的'点击'声音)。在我的活动按钮的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。该硬件有任何已知问题吗?

再次......事情有效,但是拥有不同的音量很烦人,而我却无法放手。还有其他人经历过这个吗?

0 个答案:

没有答案