fix volume, and disable on initialize failure

This commit is contained in:
Cary Sandvig 2000-11-28 02:01:56 +00:00
parent d2a5221f4a
commit 23a4ae9a0d
19 changed files with 83 additions and 31 deletions

View File

@ -139,6 +139,8 @@ static void mix_buffer(byte* buf) {
static void update_linux(void) {
if (buffers.empty())
return;
if (!audio_is_active)
return;
switch (want_buffers) {
case 0:
// all buffers are full right now. This is a good state.
@ -162,32 +164,37 @@ static void update_linux(void) {
static void* internal_update(void*) {
if ((output_fd = open(audio_device->c_str(), O_WRONLY, 0)) == -1) {
audio_cat->error() << "could not open '" << audio_device << "'" << endl;
audio_is_active = false;
return (void*)0L;
}
// this one I don't know about
int fragsize = 0x0004000c;
if (ioctl(output_fd, SNDCTL_DSP_SETFRAGMENT, &fragsize) == -1) {
audio_cat->error() << "faied to set fragment size" << endl;
audio_is_active = false;
return (void*)0L;
}
// for now signed, 16-bit, little endian
int format = AFMT_S16_LE;
if (ioctl(output_fd, SNDCTL_DSP_SETFMT, &format) == -1) {
audio_cat->error() << "failed to set format on the dsp" << endl;
audio_is_active = false;
return (void*)0L;
}
// set stereo
int stereo = 1;
if (ioctl(output_fd, SNDCTL_DSP_STEREO, &stereo) == -1) {
audio_cat->error() << "failed to set stereo on the dsp" << endl;
audio_is_active = false;
return (void*)0L;
}
// set the frequency
if (ioctl(output_fd, SNDCTL_DSP_SPEED, &audio_mix_freq) == -1) {
audio_cat->error() << "failed to set frequency on the dsp" << endl;
audio_is_active = false;
return (void*)0L;
}
while (!stop_mixing) {
while (!stop_mixing && !audio_is_active) {
if (have_buffers == 0) {
ipc_traits::sleep(0, audio_auto_update_delay);
} else {
@ -219,6 +226,8 @@ static void shutdown_linux(void) {
static void initialize(void) {
if (have_initialized)
return;
if (!audio_is_active)
return;
buffer1 = new byte[audio_buffer_size];
buffer2 = new byte[audio_buffer_size];
@ -350,7 +359,7 @@ void LinuxSamplePlayer::stop_sound(AudioTraits::SoundClass*,
buffers.erase(lplaying->get_data());
}
void LinuxSamplePlayer::set_volume(AudioTraits::PlayingClass*, int) {
void LinuxSamplePlayer::set_volume(AudioTraits::PlayingClass*, float) {
}
LinuxSamplePlayer* LinuxSamplePlayer::get_instance(void) {
@ -375,7 +384,7 @@ void LinuxMusicPlayer::stop_sound(AudioTraits::SoundClass*,
initialize();
}
void LinuxMusicPlayer::set_volume(AudioTraits::PlayingClass*, int) {
void LinuxMusicPlayer::set_volume(AudioTraits::PlayingClass*, float) {
}
LinuxMusicPlayer* LinuxMusicPlayer::get_instance(void) {

View File

@ -124,7 +124,7 @@ public:
AudioTraits::PlayingClass*);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, int);
virtual void set_volume(AudioTraits::PlayingClass*, float);
public:
// used by the readers
static LinuxSamplePlayer* get_instance(void);
@ -141,7 +141,7 @@ public:
AudioTraits::PlayingClass*);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, int);
virtual void set_volume(AudioTraits::PlayingClass*, float);
public:
// used by the readers
static LinuxMusicPlayer* get_instance(void);

View File

@ -9,7 +9,8 @@
// Description: Play some audio
////////////////////////////////////////////////////////////////////
INLINE void AudioManager::play(AudioSound* sound) {
get_ptr()->ns_play(sound);
if (audio_is_active)
get_ptr()->ns_play(sound);
}
////////////////////////////////////////////////////////////////////
@ -18,6 +19,8 @@ INLINE void AudioManager::play(AudioSound* sound) {
// Description: make sure buffers are full
////////////////////////////////////////////////////////////////////
INLINE void AudioManager::update(void) {
if (!audio_is_active)
return;
mutex_lock l(_manager_mutex);
if (_update_func != (UpdateFunc*)0L)
(*_update_func)();
@ -30,7 +33,8 @@ INLINE void AudioManager::update(void) {
// Description: spawn a thread to call update
////////////////////////////////////////////////////////////////////
INLINE void AudioManager::spawn_update(void) {
get_ptr()->ns_spawn_update();
if (audio_is_active)
get_ptr()->ns_spawn_update();
}
////////////////////////////////////////////////////////////////////
@ -47,8 +51,9 @@ INLINE void AudioManager::shutdown(void) {
// Access: Public, Static
// Description: set the volume on a sound instance
////////////////////////////////////////////////////////////////////
INLINE void AudioManager::set_volume(AudioSound* sound, int v) {
get_ptr()->ns_set_volume(sound, v);
INLINE void AudioManager::set_volume(AudioSound* sound, float v) {
if (audio_is_active)
get_ptr()->ns_set_volume(sound, v);
}
////////////////////////////////////////////////////////////////////
@ -57,7 +62,8 @@ INLINE void AudioManager::set_volume(AudioSound* sound, int v) {
// Description: stop playing a given sound
////////////////////////////////////////////////////////////////////
INLINE void AudioManager::stop(AudioSound* sound) {
get_ptr()->ns_stop(sound);
if (audio_is_active)
get_ptr()->ns_stop(sound);
}
////////////////////////////////////////////////////////////////////
@ -66,7 +72,8 @@ INLINE void AudioManager::stop(AudioSound* sound) {
// Description: set the looping state of the given sound
////////////////////////////////////////////////////////////////////
INLINE void AudioManager::set_loop(AudioSound* sound, bool state) {
get_ptr()->ns_set_loop(sound, state);
if (audio_is_active)
get_ptr()->ns_set_loop(sound, state);
}
////////////////////////////////////////////////////////////////////

View File

@ -145,7 +145,7 @@ void* AudioManager::spawned_update(void* data) {
// Access: Private
// Description: get the player off the sound, and set volume on it
////////////////////////////////////////////////////////////////////
void AudioManager::ns_set_volume(AudioSound* sound, int v) {
void AudioManager::ns_set_volume(AudioSound* sound, float v) {
sound->get_player()->set_volume(sound->get_state(), v);
}

View File

@ -8,6 +8,7 @@
#include "audio_trait.h"
#include "audio_sound.h"
#include "config_audio.h"
#include <ipc_mutex.h>
#include <ipc_thread.h>
@ -21,7 +22,7 @@ private:
void ns_stop(AudioSound*);
void ns_set_loop(AudioSound*, bool);
bool ns_get_loop(AudioSound*);
void ns_set_volume(AudioSound*, int);
void ns_set_volume(AudioSound*, float);
void ns_spawn_update(void);
void ns_shutdown(void);
void ns_update(void);
@ -50,7 +51,7 @@ PUBLISHED:
INLINE static void stop(AudioSound*);
INLINE static void set_loop(AudioSound*, bool);
INLINE static bool get_loop(AudioSound*);
INLINE static void set_volume(AudioSound*, int);
INLINE static void set_volume(AudioSound*, float);
INLINE static void update(void);
INLINE static void spawn_update(void);
INLINE static void shutdown(void);

View File

@ -331,7 +331,8 @@ void MikModSamplePlayer::stop_sound(AudioTraits::SoundClass* sample,
// stop it
}
void MikModSamplePlayer::set_volume(AudioTraits::PlayingClass* state, int v) {
void MikModSamplePlayer::set_volume(AudioTraits::PlayingClass* state,
float v) {
initialize();
MikModSamplePlaying* mplay = (MikModSamplePlaying*)state;
Voice_SetVolume(mplay->get_voice(), v);
@ -362,7 +363,7 @@ void MikModFmsynthPlayer::stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*) {
}
void MikModFmsynthPlayer::set_volume(AudioTraits::PlayingClass*, int) {
void MikModFmsynthPlayer::set_volume(AudioTraits::PlayingClass*, float) {
audio_cat->error()
<< "trying to set volume on a sample with a MikModFmsynthPlayer" << endl;
}
@ -391,7 +392,7 @@ void MikModMidiPlayer::stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*) {
}
void MikModMidiPlayer::set_volume(AudioTraits::PlayingClass*, int) {
void MikModMidiPlayer::set_volume(AudioTraits::PlayingClass*, float) {
audio_cat->error()
<< "trying to set volume on a sample with a MikModMidiPlayer" << endl;
}

View File

@ -111,7 +111,7 @@ public:
AudioTraits::PlayingClass*);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, int);
virtual void set_volume(AudioTraits::PlayingClass*, float);
public:
// used by the readers
static MikModSamplePlayer* get_instance(void);
@ -128,7 +128,7 @@ public:
AudioTraits::PlayingClass*);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, int);
virtual void set_volume(AudioTraits::PlayingClass*, float);
public:
// used by the readers
static MikModFmsynthPlayer* get_instance(void);
@ -145,7 +145,7 @@ public:
AudioTraits::PlayingClass*);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, int);
virtual void set_volume(AudioTraits::PlayingClass*, float);
public:
// used by the readers
static MikModMidiPlayer* get_instance(void);

View File

@ -81,7 +81,7 @@ void NullPlayer::stop_sound(AudioTraits::SoundClass*,
audio_cat->debug() << "in stop sound in Null audio driver" << endl;
}
void NullPlayer::set_volume(AudioTraits::PlayingClass*, int) {
void NullPlayer::set_volume(AudioTraits::PlayingClass*, float) {
if (audio_cat->is_debug())
audio_cat->debug() << "in set volume in Null audio driver"
<< endl;

View File

@ -44,7 +44,7 @@ public:
AudioTraits::PlayingClass*);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, int);
virtual void set_volume(AudioTraits::PlayingClass*, float);
};
#include "audio_null_traits.I"

View File

@ -37,7 +37,9 @@ INLINE bool AudioPool::verify_sound(const string& filename) {
// file cannot be found, returns NULL.
////////////////////////////////////////////////////////////////////
INLINE AudioSound* AudioPool::load_sound(const string& filename) {
return get_ptr()->ns_load_sound(filename);
if (audio_is_active)
return get_ptr()->ns_load_sound(filename);
return (AudioSound*)0L;
}
////////////////////////////////////////////////////////////////////

View File

@ -30,6 +30,7 @@ static void check_sound_loaders(void) {
AudioPool* AudioPool::get_ptr(void) {
if (_global_ptr == (AudioPool*)0L)
_global_ptr = new AudioPool;
audio_load_loaders();
return _global_ptr;
}

View File

@ -8,6 +8,7 @@
#include "audio_sound.h"
#include "audio_trait.h"
#include "config_audio.h"
#include <map>
#include <pandabase.h>
#include <filename.h>

View File

@ -58,6 +58,6 @@ void AudioTraits::PlayerClass::stop_sound(AudioTraits::SoundClass*,
audio_cat->error() << "In abstract PlayerClass::stop_sound!" << endl;
}
void AudioTraits::PlayerClass::set_volume(AudioTraits::PlayingClass*, int) {
void AudioTraits::PlayerClass::set_volume(AudioTraits::PlayingClass*, float) {
audio_cat->error() << "In abstract PlayerClass::set_volume!" << endl;
}

View File

@ -46,7 +46,7 @@ public:
virtual void play_sound(SoundClass*, PlayingClass*) = 0;
virtual void stop_sound(SoundClass*, PlayingClass*) = 0;
virtual void set_volume(PlayingClass*, int) = 0;
virtual void set_volume(PlayingClass*, float) = 0;
};
};

View File

@ -25,6 +25,11 @@ INLINE LPDIRECTSOUNDBUFFER WinSamplePlaying::get_channel(void) {
return _channel;
}
INLINE IDirectMusicPerformance* WinMusic::get_performance(void) const {
WinMusic* wmusic = (WinMusic*)_sound;
return wmusic->get_performance();
}
INLINE WinSamplePlayer::WinSamplePlayer(void) : AudioTraits::PlayerClass() {
}

View File

@ -28,6 +28,7 @@ static IDirectSound* musicDirectSound = NULL;
if (FAILED(_result)) { \
audio_cat->error() << _msg << " at " << __FILE__ << ":" << __LINE__ \
<< endl; \
audio_is_active = false; \
return; \
}
@ -40,6 +41,8 @@ static void update_win(void) {
static void initialize(void) {
if (have_initialized)
return;
if (!audio_is_active)
return;
if (audio_cat->is_debug())
audio_cat->debug() << "in winAudio initialize" << endl;
@ -821,9 +824,16 @@ void WinSamplePlayer::stop_sound(AudioTraits::SoundClass*,
chan->Stop();
}
void WinSamplePlayer::set_volume(AudioTraits::PlayingClass*, int) {
void WinSamplePlayer::set_volume(AudioTraits::PlayingClass* play, float v) {
if (audio_cat->is_debug())
audio_cat->debug() << "winsampleplayer set_volume" << endl;
initialize();
WinSamplePlaying* wplay = (WinSamplePlaying*)play;
LPDIRECTSOUNDBUFFER chan = wplay->get_channel();
if (chan) {
LONG v2 = (v * (DSBVOLUME_MAX - DSBVOLUME_MIN)) + DSBVOLUME_MIN;
chan->SetVolume(v2);
}
}
WinSamplePlayer* WinSamplePlayer::get_instance(void) {
@ -895,9 +905,15 @@ void WinMusicPlayer::stop_sound(AudioTraits::SoundClass* music,
}
}
void WinMusicPlayer::set_volume(AudioTraits::PlayingClass*, int) {
void WinMusicPlayer::set_volume(AudioTraits::PlayingClass* play, float v) {
if (audio_cat->is_debug())
audio_cat->debug() << "WinMusicPlayer::set_volume()" << endl;
WinMusicPlaying* wplay = (WinMusicPlaying*)play;
IDirectMusicPerformance* perf = wplay->get_performance();
if (perf) {
LONG v2 = (v * (DSBVOLUME_MAX - DSBVOLUME_MIN)) + DSBVOLUME_MIN;
perf->SetGlobalParam(GUID_PerfMasterVolume, &v2, sizeof(LONG));
}
}
WinMusicPlayer* WinMusicPlayer::get_instance(void) {

View File

@ -89,6 +89,7 @@ public:
virtual AudioTraits::PlayingClass::PlayingStatus status(void);
static void destroy(AudioTraits::PlayingClass*);
INLINE IDirectMusicPerformance* get_performance(void) const;
};
class EXPCL_PANDA WinSamplePlayer : public AudioTraits::PlayerClass {
@ -100,7 +101,7 @@ public:
AudioTraits::PlayingClass*);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, int);
virtual void set_volume(AudioTraits::PlayingClass*, float);
public:
// used by the readers
static WinSamplePlayer* get_instance(void);
@ -117,7 +118,7 @@ public:
AudioTraits::PlayingClass*);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, int);
virtual void set_volume(AudioTraits::PlayingClass*, float);
public:
// used by the readers
static WinMusicPlayer* get_instance(void);

View File

@ -21,6 +21,7 @@ int audio_buffer_size = config_audio.GetInt("audio-buffer-size", 4096);
string* audio_device;
int audio_auto_update_delay = config_audio.GetInt("audio-auto-update-delay",
100000);
bool audio_is_active = config_audio.GetBool("audio-is-active", true);
ConfigureFn(config_audio) {
AudioSound::init_type();
@ -43,6 +44,12 @@ ConfigureFn(config_audio) {
*audio_driver_params += (*i).Val();
}
audio_device = new string(config_audio.GetString("audio-device",
"/dev/dsp"));
}
void audio_load_loaders(void) {
Config::ConfigTable::Symbol::iterator i;
Config::ConfigTable::Symbol loaders;
config_audio.GetAll("audio-loader", loaders);
for (i=loaders.begin(); i!=loaders.end(); ++i) {
@ -53,6 +60,4 @@ ConfigureFn(config_audio) {
if (tmp == (void*)0L)
audio_cat->info() << "unable to load: " << load_dso_error() << endl;
}
audio_device = new string(config_audio.GetString("audio-device",
"/dev/dsp"));
}

View File

@ -19,5 +19,8 @@ extern EXPCL_PANDA string* audio_driver_params;
extern EXPCL_PANDA int audio_buffer_size;
extern EXPCL_PANDA string* audio_device;
extern EXPCL_PANDA int audio_auto_update_delay;
extern EXPCL_PANDA bool audio_is_active;
extern EXPCL_PANDA void audio_load_loaders(void);
#endif /* __CONFIG_AUDIO_H__ */