Как отключить/включить BASS?

Как я могу отключить и включить воспроизведение BASS (независимо от платформы)? До сих пор я сохранял текущую громкость перед отключением звука, устанавливал громкость на 0 и устанавливал ее обратно, если отключил звук.

Пример:
часть моего курса C++

volume_t lastVolume; // 0.0f = silent, 1.0f = max (volume_t = float)

// ...

bool mute(bool mute)
{
    if( mute )
    {
        lastVolume = getVolume(); // Save current volume

        return setVolume(0.0f); // Set volume to silent
    }
    else
    {
        return setVolume(lastVolume); // restore last volume before muting
    }
}

Есть лучший способ сделать это? В документации BASS Api есть только одна функция mute:

BOOL BASS_WASAPI_SetMute(
    BOOL mute
);

Тем не менее, это выглядит хорошо, но, к сожалению, является частью BASSWASAPI (ввод-вывод WASAPI в Windows Vista и более поздних версиях, который не является кроссплатформенным).


person ollo    schedule 06.02.2013    source источник
comment
Может ли downvoter объяснить, почему за этот вопрос проголосовали?   -  person ollo    schedule 18.02.2013


Ответы (1)


Вот мое решение:

class PlayerBASS : public virtual AbstractPlayer
{
public:

    // ...

    /**
     * Set volume on current channel.
     * 
     * @param volume      volume (0.0f - 1.0f)
     */
    bool setVolume(volume_t volume)
    {
        return BASS_ChannelSetAttribute(streamHandle, BASS_ATTRIB_VOL, volume);
    }

    /**
     * Get volume on current channel.
     *
     * @return            volume (0.0f - 1.0f)
     */
    volume_t getVolume()
    {
        float value;
        BASS_ChannelGetAttribute(streamHandle, BASS_ATTRIB_VOL, &value);

        return value;
    }

    /**
     * Mute / Unmute the volume on current channel.
     *
     * @return            'true' if successful, 'false' if error
     */
    bool mute(bool mute)
    {    
        if( mute == muted ) // dont mute if already muted (and vice versa)
            return true;

        bool rtn; // returnvalue

        if( mute ) // mute
        {
            lastVolume = getVolume(); // save current volume
            rtn = setVolume(0.0f); // set volume to 0.0f (= mute)
            muted = true; // set mute-state
        }
        else // unmute
        {
            rtn = setVolume(lastVolume); // restore volume
            muted = false; // set mute-state
        }

        return rtn; // returnvalue
    }

    // ...

private:
    // ...
    HSTREAM streamHandle; // Streamhandle
    bool muted; // flag for mute-state ('true': muted, 'false': unmuted) - init with 'false'
    volume_t lastVolume; // lastVolume
};

Не используйте здесь BASS_SetVolume() / BASS_GetVolume() - это установит громкость всей вашей системы!

Вот и все!

person ollo    schedule 13.02.2013
comment
Действительно опоздал на вечеринку, но вы также можете просто пропустить часть setVolume(lastVolume) оператора else, если громкость не равна 0, чтобы обработать случай, когда громкость была увеличена с помощью другого пути кода. . - person Magnus Österlind; 30.04.2017