mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
new audiotraits for new system
This commit is contained in:
parent
2d5494ee4c
commit
f9b240fb27
32
panda/src/audiotraits/Sources.pp
Normal file
32
panda/src/audiotraits/Sources.pp
Normal file
@ -0,0 +1,32 @@
|
||||
#define OTHER_LIBS dtoolconfig dtool
|
||||
#define DIRECTORY_IF_AUDIO yes
|
||||
|
||||
#begin lib_target
|
||||
#define USE_RAD_MSS yes
|
||||
#define TARGET miles_audio
|
||||
#define BUILDING_DLL BUILDING_MILES_AUDIO
|
||||
#define LOCAL_LIBS audio
|
||||
|
||||
#define SOURCES \
|
||||
config_milesAudio.cxx config_milesAudio.h \
|
||||
milesAudioManager.cxx milesAudioManager.h \
|
||||
milesAudioSound.I milesAudioSound.cxx milesAudioSound.h
|
||||
|
||||
#end lib_target
|
||||
|
||||
//#begin lib_target
|
||||
// #define TARGET audio_linux
|
||||
// #define BUILDING_DLL BUILDING_MISC
|
||||
// //#define LOCAL_LIBS \
|
||||
// // audio
|
||||
//
|
||||
// #define SOURCES \
|
||||
// $[if $[HAVE_SYS_SOUNDCARD_H], \
|
||||
// linuxAudioManager.cxx linuxAudioManager.h \
|
||||
// linuxAudioSound.cxx linuxAudioSound.h \
|
||||
// , \
|
||||
// nullAudioManager.cxx nullAudioManager.h \
|
||||
// nullAudioSound.cxx nullAudioSound.h \
|
||||
// ]
|
||||
//
|
||||
//#end lib_target
|
60
panda/src/audiotraits/config_milesAudio.cxx
Normal file
60
panda/src/audiotraits/config_milesAudio.cxx
Normal file
@ -0,0 +1,60 @@
|
||||
// Filename: config_milesAudio.cxx
|
||||
// Created by: skyler
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://www.panda3d.org/license.txt .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d@yahoogroups.com .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "config_milesAudio.h"
|
||||
#include "milesAudioManager.h"
|
||||
#include "milesAudioSound.h"
|
||||
#include "dconfig.h"
|
||||
|
||||
ConfigureDef(config_milesAudio);
|
||||
NotifyCategoryDef(milesAudio, "");
|
||||
|
||||
ConfigureFn(config_milesAudio) {
|
||||
init_libMilesAudio();
|
||||
}
|
||||
/*
|
||||
const float LinearIntegrator::_max_linear_dt =
|
||||
config_milesAudio.GetFloat("default_max_linear_dt", 1.0f / 30.0f);
|
||||
|
||||
const float AngularIntegrator::_max_angular_dt =
|
||||
config_milesAudio.GetFloat("default_max_angular_dt", 1.0f / 30.0f);
|
||||
|
||||
int LinearNoiseForce::_random_seed =
|
||||
config_milesAudio.GetInt("default_noise_force_seed", 665);
|
||||
|
||||
const float milesAudioObject::_default_terminal_velocity =
|
||||
config_milesAudio.GetFloat("default_terminal_velocity", 400.0f);*/
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: init_libMilesAudio
|
||||
// Description: Initializes the library. This must be called at
|
||||
// least once before any of the functions or classes in
|
||||
// this library can be used. Normally it will be
|
||||
// called by the static initializers and need not be
|
||||
// called explicitly, but special cases exist.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void
|
||||
init_libMilesAudio() {
|
||||
static bool initialized = false;
|
||||
if (initialized) {
|
||||
return;
|
||||
}
|
||||
initialized = true;
|
||||
|
||||
AudioManager::register_AudioManager_creator(Create_AudioManager);
|
||||
}
|
31
panda/src/audiotraits/config_milesAudio.h
Normal file
31
panda/src/audiotraits/config_milesAudio.h
Normal file
@ -0,0 +1,31 @@
|
||||
// Filename: config_milesAudio.h
|
||||
// Created by: skyler
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://www.panda3d.org/license.txt .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d@yahoogroups.com .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef CONFIG_MILESAUDIO_H
|
||||
#define CONFIG_MILESAUDIO_H
|
||||
|
||||
#include "pandabase.h"
|
||||
#include "notifyCategoryProxy.h"
|
||||
#include "dconfig.h"
|
||||
|
||||
ConfigureDecl(config_milesAudio, EXPCL_MILES_AUDIO, EXPTP_MILES_AUDIO);
|
||||
NotifyCategoryDecl(milesAudio, EXPCL_MILES_AUDIO, EXPTP_MILES_AUDIO);
|
||||
|
||||
extern EXPCL_MILES_AUDIO void init_libMilesAudio();
|
||||
|
||||
#endif // CONFIG_MILESAUDIO_H
|
282
panda/src/audiotraits/milesAudioManager.cxx
Normal file
282
panda/src/audiotraits/milesAudioManager.cxx
Normal file
@ -0,0 +1,282 @@
|
||||
// Filename: milesAudioManager.cxx
|
||||
// Created by: skyler (June 6, 2001)
|
||||
// Prior system by: cary
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://www.panda3d.org/license.txt .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d@yahoogroups.com .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "pandabase.h"
|
||||
#ifdef HAVE_RAD_MSS //[
|
||||
|
||||
#include "milesAudioManager.h"
|
||||
#include "config_audio.h"
|
||||
#include "config_util.h"
|
||||
|
||||
int MilesAudioManager::_active_managers;
|
||||
HDLSFILEID MilesAudioManager::_dls_field;
|
||||
|
||||
AudioManager* Create_AudioManager() {
|
||||
audio_debug("Create_AudioManger()");
|
||||
return new MilesAudioManager();
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: MilesAudioManager::MilesAudioManager
|
||||
// Access: Public
|
||||
// Description: set the overall volume of SFX
|
||||
////////////////////////////////////////////////////////////////////
|
||||
MilesAudioManager::
|
||||
MilesAudioManager() {
|
||||
audio_debug("MilesAudioManager::MilesAudioManager()");
|
||||
audio_debug(" audio_active="<<audio_active);
|
||||
audio_debug(" audio_volume="<<audio_volume);
|
||||
_active = audio_active;
|
||||
_volume = audio_volume;
|
||||
if (!_active_managers) {
|
||||
S32 use_digital=(audio_play_wave || audio_play_mp3)?1:0;
|
||||
S32 use_MIDI=(audio_play_midi)?1:0;
|
||||
if (audio_play_midi && audio_software_midi) {
|
||||
use_MIDI=AIL_QUICK_DLS_ONLY;
|
||||
}
|
||||
audio_debug(" use_digital="<<use_digital);
|
||||
audio_debug(" use_MIDI="<<use_MIDI);
|
||||
audio_debug(" audio_output_rate="<<audio_output_rate);
|
||||
audio_debug(" audio_output_bits="<<audio_output_bits);
|
||||
audio_debug(" audio_output_channels="<<audio_output_channels);
|
||||
audio_debug(" audio_software_midi="<<audio_software_midi);
|
||||
if (AIL_quick_startup(use_digital,
|
||||
use_MIDI, audio_output_rate,
|
||||
audio_output_bits, audio_output_channels)) {
|
||||
if (audio_software_midi) {
|
||||
// Load the downloadable sounds file:
|
||||
HDLSDEVICE dls;
|
||||
AIL_quick_handles(0, 0, &dls);
|
||||
nassertv(audio_dls_file);
|
||||
nassertv(!_dls_field);
|
||||
audio_debug(" audio_dls_file=\""<<*audio_dls_file<<"\"");
|
||||
_dls_field=AIL_DLS_load_file(dls, audio_dls_file->c_str(), 0);
|
||||
if (!_dls_field) {
|
||||
audio_error(" AIL_DLS_load_memory() failed, \""<<AIL_last_error()
|
||||
<<"\" Switching to hardware midi");
|
||||
AIL_quick_shutdown();
|
||||
if (!AIL_quick_startup(use_digital, 1, audio_output_rate,
|
||||
audio_output_bits, audio_output_channels)) {
|
||||
audio_error(" startup failed, "<<AIL_last_error());
|
||||
}
|
||||
} else {
|
||||
audio_debug(" using Miles software midi");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
audio_debug(" AIL_quick_startup failed: "<<AIL_last_error());
|
||||
}
|
||||
}
|
||||
// We increment _active_managers regardless of possible errors above.
|
||||
// The miles shutdown call will do the right thing when it's called,
|
||||
// either way.
|
||||
audio_debug(" _active_managers="<<_active_managers);
|
||||
++_active_managers;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: MilesAudioManager::MilesAudioManager
|
||||
// Access: Public
|
||||
// Description: set the overall volume of SFX
|
||||
////////////////////////////////////////////////////////////////////
|
||||
MilesAudioManager::
|
||||
~MilesAudioManager() {
|
||||
audio_debug("MilesAudioManager::~MilesAudioManager()");
|
||||
// Be sure to delete associated sounds before deleting the manager:
|
||||
nassertv(_soundsOnLoan.empty());
|
||||
SoundMap::iterator i=_sounds.begin();
|
||||
for (; i!=_sounds.end(); ++i) {
|
||||
AIL_quick_unload(i->second);
|
||||
}
|
||||
_sounds.clear();
|
||||
--_active_managers;
|
||||
if (!_active_managers) {
|
||||
if (audio_software_midi) {
|
||||
HDLSDEVICE dls;
|
||||
AIL_quick_handles(0, 0, &dls);
|
||||
AIL_DLS_unload(dls, _dls_field);
|
||||
#ifndef NDEBUG //[
|
||||
// Clear _dls_field in debug version (for assert in ctor):
|
||||
_dls_field=0;
|
||||
#endif //]
|
||||
}
|
||||
AIL_quick_shutdown();
|
||||
audio_debug(" AIL_quick_shutdown()");
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: MilesAudioManager::load
|
||||
// Access:
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
HAUDIO MilesAudioManager::
|
||||
load(Filename file_name) {
|
||||
string stmp = file_name.to_os_specific();
|
||||
audio_debug(" \"" << stmp << "\"");
|
||||
HAUDIO audio = AIL_quick_load(stmp.c_str());
|
||||
if (!audio) {
|
||||
audio_debug(" MilesAudioManager::load failed "<<AIL_last_error());
|
||||
}
|
||||
return audio;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: MilesAudioManager::get_sound
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
AudioSound* MilesAudioManager::
|
||||
get_sound(const string& file_name) {
|
||||
audio_debug("MilesAudioManager::get_sound(file_name=\""<<file_name<<"\"");
|
||||
Filename path = file_name;
|
||||
path.resolve_filename(get_sound_path());
|
||||
audio_debug(" resolved file_name is '"<<path<<"'");
|
||||
|
||||
HAUDIO audio=0;
|
||||
// Get the sound, either from the cache or from a loader:
|
||||
SoundMap::const_iterator si=_sounds.find(path);
|
||||
if (si != _sounds.end()) {
|
||||
// ...found the sound in the cache.
|
||||
audio = (*si).second;
|
||||
audio_debug(" sound found in pool 0x" << (void*)audio);
|
||||
} else {
|
||||
// ...the sound was not found in the cache/pool.
|
||||
audio=load(path);
|
||||
if (audio) {
|
||||
// Put it in the pool:
|
||||
// The following is roughly like: _sounds[path] = audio;
|
||||
// But, it gives us an iterator into the map.
|
||||
pair<SoundMap::const_iterator, bool> ib
|
||||
=_sounds.insert(pair<string, HAUDIO>(path, audio));
|
||||
if (!ib.second) {
|
||||
// The insert failed.
|
||||
audio_debug(" failed map insert of "<<path);
|
||||
return 0;
|
||||
}
|
||||
// Set si, so that we can get a reference to the path
|
||||
// for the MilesAudioSound.
|
||||
si=ib.first;
|
||||
}
|
||||
}
|
||||
// Create an AudioSound from the sound:
|
||||
AudioSound* audioSound = 0;
|
||||
if (audio) {
|
||||
MilesAudioSound* milesAudioSound
|
||||
=new MilesAudioSound(*this, audio, (*si).first);
|
||||
nassertr(milesAudioSound, 0);
|
||||
milesAudioSound->set_active(_active);
|
||||
_soundsOnLoan.insert(milesAudioSound);
|
||||
audioSound=milesAudioSound;
|
||||
}
|
||||
audio_debug(" returning 0x" << (void*)audioSound);
|
||||
return audioSound;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: MilesAudioManager::drop_sound
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void MilesAudioManager::
|
||||
drop_sound(const string& file_name) {
|
||||
audio_debug("MilesAudioManager::drop_sound(file_name=\""
|
||||
<<file_name<<"\"");
|
||||
Filename path = file_name;
|
||||
path.resolve_filename(get_sound_path());
|
||||
audio_debug(" path=\""<<path<<"\"");
|
||||
SoundMap::iterator i=_sounds.find(path);
|
||||
if (i != _sounds.end()) {
|
||||
AIL_quick_unload(i->second);
|
||||
_sounds.erase(i);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: MilesAudioManager::release_sound
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void MilesAudioManager::
|
||||
release_sound(MilesAudioSound* audioSound) {
|
||||
audio_debug("MilesAudioManager::release_sound(audioSound=\""
|
||||
<<audioSound->get_name()<<"\"");
|
||||
_soundsOnLoan.erase(audioSound);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: MilesAudioManager::set_volume
|
||||
// Access: Public
|
||||
// Description: set the overall volume
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void MilesAudioManager::
|
||||
set_volume(float volume) {
|
||||
audio_debug("MilesAudioManager::set_volume(volume="<<volume<<")");
|
||||
if (_volume!=volume) {
|
||||
_volume = volume;
|
||||
// Tell our AudioSounds to adjust:
|
||||
AudioSet::iterator i=_soundsOnLoan.begin();
|
||||
for (; i!=_soundsOnLoan.end(); ++i) {
|
||||
(**i).set_volume((**i).get_volume());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: MilesAudioManager::get_volume
|
||||
// Access: Public
|
||||
// Description: get the overall volume
|
||||
////////////////////////////////////////////////////////////////////
|
||||
float MilesAudioManager::
|
||||
get_volume() {
|
||||
audio_debug("MilesAudioManager::get_volume() returning "<<_volume);
|
||||
return _volume;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: MilesAudioManager::set_active
|
||||
// Access: Public
|
||||
// Description: turn on/off
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void MilesAudioManager::
|
||||
set_active(bool active) {
|
||||
audio_debug("MilesAudioManager::set_active(flag="<<active<<")");
|
||||
if (_active!=active) {
|
||||
_active=active;
|
||||
// Tell our AudioSounds to adjust:
|
||||
AudioSet::iterator i=_soundsOnLoan.begin();
|
||||
for (; i!=_soundsOnLoan.end(); ++i) {
|
||||
(**i).set_active(_active);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: MilesAudioManager::get_active
|
||||
// Access: Public
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool MilesAudioManager::
|
||||
get_active() {
|
||||
audio_debug("MilesAudioManager::get_active() returning "<<_active);
|
||||
return _active;
|
||||
}
|
||||
|
||||
#endif //]
|
68
panda/src/audiotraits/milesAudioManager.h
Normal file
68
panda/src/audiotraits/milesAudioManager.h
Normal file
@ -0,0 +1,68 @@
|
||||
// Filename: milesAudioManager.h
|
||||
// Created by: skyler (June 6, 2001)
|
||||
// Prior system by: cary
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://www.panda3d.org/license.txt .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d@yahoogroups.com .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __MILES_AUDIO_MANAGER_H__ //[
|
||||
#define __MILES_AUDIO_MANAGER_H__
|
||||
|
||||
#include <pandabase.h>
|
||||
#ifdef HAVE_RAD_MSS //[
|
||||
|
||||
#include "audioManager.h"
|
||||
#include "milesAudioSound.h"
|
||||
|
||||
class EXPCL_MILES_AUDIO MilesAudioManager: public AudioManager {
|
||||
public:
|
||||
MilesAudioManager();
|
||||
~MilesAudioManager();
|
||||
|
||||
AudioSound* get_sound(const string& file_name);
|
||||
void drop_sound(const string& file_name);
|
||||
|
||||
void set_volume(float volume);
|
||||
float get_volume();
|
||||
|
||||
void set_active(bool active);
|
||||
bool get_active();
|
||||
|
||||
private:
|
||||
typedef pmap<string, HAUDIO > SoundMap;
|
||||
SoundMap _sounds;
|
||||
typedef pset<MilesAudioSound* > AudioSet;
|
||||
AudioSet _soundsOnLoan;
|
||||
float _volume;
|
||||
bool _active;
|
||||
// keep a count for startup and shutdown:
|
||||
static int _active_managers;
|
||||
static HDLSFILEID _dls_field;
|
||||
|
||||
HAUDIO load(Filename file_name);
|
||||
// Tell the manager that the sound dtor was called.
|
||||
void release_sound(MilesAudioSound* audioSound);
|
||||
|
||||
friend MilesAudioSound;
|
||||
};
|
||||
|
||||
EXPCL_MILES_AUDIO AudioManager* Create_AudioManager();
|
||||
|
||||
|
||||
#endif //]
|
||||
|
||||
#endif //]
|
||||
|
||||
|
24
panda/src/audiotraits/milesAudioSound.I
Normal file
24
panda/src/audiotraits/milesAudioSound.I
Normal file
@ -0,0 +1,24 @@
|
||||
// Filename: milesAudioSound.I
|
||||
// Created by: skyler (June 6, 2001)
|
||||
// Prior system by: cary
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://www.panda3d.org/license.txt .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d@yahoogroups.com .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
224
panda/src/audiotraits/milesAudioSound.cxx
Normal file
224
panda/src/audiotraits/milesAudioSound.cxx
Normal file
@ -0,0 +1,224 @@
|
||||
// Filename: milesAudioSound.cxx
|
||||
// Created by: skyler (June 6, 2001)
|
||||
// Prior system by: cary
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://www.panda3d.org/license.txt .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d@yahoogroups.com .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <pandabase.h>
|
||||
#ifdef HAVE_RAD_MSS //[
|
||||
|
||||
#include "milesAudioSound.h"
|
||||
#include "milesAudioManager.h"
|
||||
|
||||
|
||||
MilesAudioSound::
|
||||
MilesAudioSound(MilesAudioManager& manager,
|
||||
HAUDIO audio, string file_name)
|
||||
: _manager(manager), _file_name(file_name),
|
||||
_start_time(0), _volume(1.0), _balance(0),
|
||||
_loop_count(1),
|
||||
_active(true), _paused(false) {
|
||||
nassertv(audio);
|
||||
nassertv(!file_name.empty());
|
||||
audio_debug("MilesAudioSound::MilesAudioSound(manager=0x"<<(void*)&manager
|
||||
<<", audio=0x"<<(void*)audio<<", file_name="<<file_name<<")");
|
||||
// Make our own copy of the sound header data:
|
||||
_audio=AIL_quick_copy(audio);
|
||||
}
|
||||
|
||||
MilesAudioSound::
|
||||
~MilesAudioSound() {
|
||||
audio_debug("MilesAudioSound::~MilesAudioSound() "<<get_name());
|
||||
_manager.release_sound(this);
|
||||
AIL_quick_unload(_audio);
|
||||
}
|
||||
|
||||
void MilesAudioSound::
|
||||
play() {
|
||||
audio_debug("MilesAudioSound::play() "<<get_name());
|
||||
if (_active) {
|
||||
// Start playing:
|
||||
if (AIL_quick_play(_audio, _loop_count)) {
|
||||
audio_debug(" started sound");
|
||||
} else {
|
||||
audio_debug(" failed to play sound "<<AIL_last_error());
|
||||
}
|
||||
} else {
|
||||
// In case _loop_count gets set to forever (zero):
|
||||
audio_debug(" paused");
|
||||
_paused=true;
|
||||
}
|
||||
}
|
||||
|
||||
void MilesAudioSound::
|
||||
stop() {
|
||||
audio_debug("MilesAudioSound::stop() "<<get_name());
|
||||
AIL_quick_halt(_audio);
|
||||
}
|
||||
|
||||
void MilesAudioSound::
|
||||
set_loop(bool loop) {
|
||||
audio_debug("MilesAudioSound::set_loop(loop="<<loop<<") "<<get_name());
|
||||
set_loop_count((loop)?0:1);
|
||||
}
|
||||
|
||||
bool MilesAudioSound::
|
||||
get_loop() const {
|
||||
audio_debug("MilesAudioSound::get_loop() returning "<<(_loop_count==0));
|
||||
return _loop_count == 0;
|
||||
}
|
||||
|
||||
void MilesAudioSound::
|
||||
set_loop_count(unsigned long loop_count) {
|
||||
audio_debug("MilesAudioSound::set_loop_count(loop_count="<<loop_count<<") "<<get_name());
|
||||
if (_loop_count!=loop_count) {
|
||||
_loop_count=loop_count;
|
||||
if (status()==PLAYING) {
|
||||
stop();
|
||||
play();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long MilesAudioSound::
|
||||
get_loop_count() const {
|
||||
audio_debug("MilesAudioSound::get_loop_count() returning "<<_loop_count);
|
||||
return _loop_count;
|
||||
}
|
||||
|
||||
void MilesAudioSound::set_time(float start_time) {
|
||||
audio_debug("MilesAudioSound::set_time(start_time="<<start_time<<") "<<get_name());
|
||||
_start_time=start_time;
|
||||
S32 milisecond_start_time=S32(1000*_start_time);
|
||||
AIL_quick_set_ms_position(_audio, milisecond_start_time);
|
||||
}
|
||||
|
||||
float MilesAudioSound::get_time() const {
|
||||
audio_debug("MilesAudioSound::get_time() returning "<<_start_time);
|
||||
return _start_time;
|
||||
}
|
||||
|
||||
void MilesAudioSound::set_volume(float volume) {
|
||||
audio_debug("MilesAudioSound::set_volume(volume="<<volume<<") "<<get_name());
|
||||
// *Set the volume even if our volume is not changing, because the
|
||||
// *MilesAudioManager will call set_volume when *its* volume changes.
|
||||
// Set the volume:
|
||||
_volume=volume;
|
||||
// Account for the category of sound:
|
||||
volume*=_manager.get_volume();
|
||||
// Change to Miles volume, range 0 to 127:
|
||||
S32 milesVolume=(S32(127*volume))%128;
|
||||
// Account for type:
|
||||
S32 audioType=AIL_quick_type(_audio);
|
||||
if (audioType==AIL_QUICK_XMIDI_TYPE
|
||||
||
|
||||
audioType==AIL_QUICK_DLS_XMIDI_TYPE) {
|
||||
// ...it's a midi file.
|
||||
AIL_quick_set_volume(_audio, milesVolume, 0); // 0 delay.
|
||||
audio_debug(" volume for this midi is now "<<milesVolume);
|
||||
} else {
|
||||
// ...it's a wav or mp3.
|
||||
// Convert balance of -1.0..1.0 to 0..127:
|
||||
S32 milesBalance=(S32(63.5*(_balance+1.0)))%128;
|
||||
AIL_quick_set_volume(_audio, milesVolume, milesBalance);
|
||||
audio_debug(" volume for this wav or mp3 is now "<<milesVolume
|
||||
<<", balance="<<milesBalance);
|
||||
}
|
||||
}
|
||||
|
||||
float MilesAudioSound::get_volume() const {
|
||||
audio_debug("MilesAudioSound::get_volume() returning "<<_volume);
|
||||
return _volume;
|
||||
}
|
||||
|
||||
void MilesAudioSound::set_active(bool active) {
|
||||
audio_debug("MilesAudioSound::set_active(active="<<active<<") "<<get_name());
|
||||
if (_active!=active) {
|
||||
_active=active;
|
||||
if (_active) {
|
||||
// ...activate the sound.
|
||||
if (_paused
|
||||
&&
|
||||
_loop_count==0) {
|
||||
// ...this sound was looping when it was paused.
|
||||
_paused=false;
|
||||
play();
|
||||
}
|
||||
} else {
|
||||
// ...deactivate the sound.
|
||||
if (status()==PLAYING) {
|
||||
if (_loop_count==0) {
|
||||
// ...we're pausing a looping sound.
|
||||
_paused=true;
|
||||
}
|
||||
stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool MilesAudioSound::get_active() const {
|
||||
audio_debug("MilesAudioSound::get_active() returning "<<_active);
|
||||
return _active;
|
||||
}
|
||||
|
||||
void MilesAudioSound::set_balance(float balance_right) {
|
||||
audio_debug("MilesAudioSound::set_balance(balance_right="<<balance_right<<") "<<get_name());
|
||||
_balance=balance_right;
|
||||
// Call set_volume to effect the change:
|
||||
set_volume(_volume);
|
||||
}
|
||||
|
||||
float MilesAudioSound::get_balance() const {
|
||||
audio_debug("MilesAudioSound::get_balance() returning "<<_balance);
|
||||
return _balance;
|
||||
}
|
||||
|
||||
float MilesAudioSound::length() const {
|
||||
float length;
|
||||
if (AIL_quick_status(_audio)==QSTAT_PLAYING) {
|
||||
length=((float)AIL_quick_ms_length(_audio))*0.001;
|
||||
} else {
|
||||
AIL_quick_play(_audio, 1);
|
||||
length=((float)AIL_quick_ms_length(_audio))*0.001;
|
||||
AIL_quick_halt(_audio);
|
||||
}
|
||||
audio_debug("MilesAudioSound::length() returning "<<length);
|
||||
return length;
|
||||
}
|
||||
|
||||
const string& MilesAudioSound::get_name() const {
|
||||
//audio_debug("MilesAudioSound::get_name() returning "<<_file_name);
|
||||
return _file_name;
|
||||
}
|
||||
|
||||
AudioSound::SoundStatus MilesAudioSound::status() const {
|
||||
if (!_audio) {
|
||||
return AudioSound::BAD;
|
||||
}
|
||||
switch (AIL_quick_status(_audio)) {
|
||||
case QSTAT_LOADED:
|
||||
case QSTAT_DONE:
|
||||
return AudioSound::READY;
|
||||
case QSTAT_PLAYING:
|
||||
return AudioSound::PLAYING;
|
||||
default:
|
||||
return AudioSound::BAD;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif //]
|
102
panda/src/audiotraits/milesAudioSound.h
Normal file
102
panda/src/audiotraits/milesAudioSound.h
Normal file
@ -0,0 +1,102 @@
|
||||
// Filename: milesAudioSound.h
|
||||
// Created by: skyler (June 6, 2001)
|
||||
// Prior system by: cary
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// PANDA 3D SOFTWARE
|
||||
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
||||
//
|
||||
// All use of this software is subject to the terms of the Panda 3d
|
||||
// Software license. You should have received a copy of this license
|
||||
// along with this source code; you will also find a current copy of
|
||||
// the license at http://www.panda3d.org/license.txt .
|
||||
//
|
||||
// To contact the maintainers of this program write to
|
||||
// panda3d@yahoogroups.com .
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __MILES_AUDIO_SOUND_H__
|
||||
#define __MILES_AUDIO_SOUND_H__
|
||||
|
||||
#include <pandabase.h>
|
||||
#ifdef HAVE_RAD_MSS //[
|
||||
|
||||
#include "audioSound.h"
|
||||
#include "mss.h"
|
||||
|
||||
|
||||
class MilesAudioManager;
|
||||
|
||||
class EXPCL_MILES_AUDIO MilesAudioSound : public AudioSound {
|
||||
public:
|
||||
~MilesAudioSound();
|
||||
|
||||
// For best compatability, set the loop_count, start_time,
|
||||
// volume, and balance, prior to calling play(). You may
|
||||
// set them while they're playing, but it's implementation
|
||||
// specific whether you get the results.
|
||||
void play();
|
||||
void stop();
|
||||
|
||||
// loop: 0 = play once; 1 = play forever.
|
||||
// inits to false.
|
||||
void set_loop(bool loop=false);
|
||||
bool get_loop() const;
|
||||
|
||||
// loop_count: 0 = forever; 1 = play once; n = play n times.
|
||||
// inits to 1.
|
||||
void set_loop_count(unsigned long loop_count=1);
|
||||
unsigned long get_loop_count() const;
|
||||
|
||||
// 0 = begining; length() = end.
|
||||
// inits to 0.0.
|
||||
void set_time(float start_time=0.0);
|
||||
float get_time() const;
|
||||
|
||||
// 0 = minimum; 1.0 = maximum.
|
||||
// inits to 1.0.
|
||||
void set_volume(float volume=1.0);
|
||||
float get_volume() const;
|
||||
|
||||
// -1.0 is hard left
|
||||
// 0.0 is centered
|
||||
// 1.0 is hard right
|
||||
// inits to 0.0.
|
||||
void set_balance(float balance_right=0.0);
|
||||
float get_balance() const;
|
||||
|
||||
// inits to manager's state.
|
||||
void set_active(bool active=true);
|
||||
bool get_active() const;
|
||||
|
||||
const string& get_name() const;
|
||||
|
||||
// return: playing time in seconds.
|
||||
float length() const;
|
||||
|
||||
AudioSound::SoundStatus status() const;
|
||||
|
||||
private:
|
||||
HAUDIO _audio;
|
||||
MilesAudioManager& _manager;
|
||||
float _start_time; // 0..length()
|
||||
float _volume; // 0..1.0
|
||||
float _balance; // -1..1
|
||||
unsigned long _loop_count;
|
||||
string _file_name;
|
||||
bool _active;
|
||||
bool _paused;
|
||||
|
||||
MilesAudioSound(MilesAudioManager& manager,
|
||||
HAUDIO audio, string file_name);
|
||||
|
||||
friend class MilesAudioManager;
|
||||
};
|
||||
|
||||
#include "milesAudioSound.I"
|
||||
|
||||
#endif //]
|
||||
|
||||
#endif /* __MILES_AUDIO_SOUND_H__ */
|
Loading…
x
Reference in New Issue
Block a user