15 #include "milesAudioSequence.h"
17 #ifdef HAVE_RAD_MSS //[
19 #include "milesAudioManager.h"
24 #undef miles_audio_debug
27 #define miles_audio_debug(x) \
28 audio_debug("MilesAudioSequence \""<<get_name()<<"\" "<< x )
30 #define miles_audio_debug(x) ((void)0)
40 MilesAudioSequence(MilesAudioManager *manager, MilesAudioManager::SoundData *sd,
41 const string &file_name) :
42 MilesAudioSound(manager, file_name),
46 audio_debug(
"MilesAudioSequence(manager=0x"<<(
void*)&manager
47 <<
", sd=0x"<<(
void*)sd<<
", file_name="<<file_name<<
")");
59 ~MilesAudioSequence() {
60 miles_audio_debug(
"~MilesAudioSequence()");
62 _manager->release_sound(
this);
63 miles_audio_debug(
"~MilesAudioSequence() done");
71 void MilesAudioSequence::
73 miles_audio_debug(
"play()");
77 if (_sd->_raw_data.empty()) {
78 milesAudio_cat.warning()
79 <<
"Could not play " << _file_name <<
": no data\n";
81 _manager->starting_sound(
this);
82 nassertv(_sequence == 0);
84 GlobalMilesManager *mgr = GlobalMilesManager::get_global_ptr();
85 if (!mgr->get_sequence(_sequence, _sequence_index,
this)){
86 milesAudio_cat.warning()
87 <<
"Could not play " << _file_name <<
": too many open sequences\n";
90 AIL_init_sequence(_sequence, &_sd->_raw_data[0], 0);
91 AIL_set_sequence_user_data(_sequence, 0, (SINTa)
this);
92 AIL_register_sequence_callback(_sequence, finish_callback);
95 set_play_rate(_play_rate);
96 AIL_set_sequence_loop_count(_sequence, _loop_count);
98 if (_got_start_time) {
99 do_set_time(_start_time);
100 AIL_resume_sequence(_sequence);
102 AIL_start_sequence(_sequence);
106 _got_start_time =
false;
110 audio_debug(
" paused "<<_file_name );
120 void MilesAudioSequence::
122 miles_audio_debug(
"stop()");
123 _manager->stopping_sound(
this);
131 if (_sequence != 0) {
132 AIL_end_sequence(_sequence);
134 GlobalMilesManager *mgr = GlobalMilesManager::get_global_ptr();
135 mgr->release_sequence(_sequence_index,
this);
147 PN_stdfloat MilesAudioSequence::
149 if (_sequence == 0) {
150 if (_got_start_time) {
157 AIL_sequence_ms_position(_sequence, NULL, ¤t_ms);
158 PN_stdfloat time = PN_stdfloat(current_ms * 0.001f);
168 void MilesAudioSequence::
169 set_volume(PN_stdfloat volume) {
170 miles_audio_debug(
"set_volume(volume="<<volume<<
")");
179 if (_sequence != 0) {
180 volume *= _manager->get_volume();
183 S32 milesVolume = (S32)(volume * 127.0f);
184 milesVolume = min(milesVolume, 127);
185 milesVolume = max(milesVolume, 0);
187 AIL_set_sequence_volume(_sequence, milesVolume, 0);
196 void MilesAudioSequence::
197 set_balance(PN_stdfloat balance_right) {
198 miles_audio_debug(
"set_balance(balance_right="<<balance_right<<
")");
199 _balance = balance_right;
209 void MilesAudioSequence::
210 set_play_rate(PN_stdfloat play_rate) {
211 miles_audio_debug(
"set_play_rate(play_rate="<<play_rate<<
")");
214 _play_rate = play_rate;
216 if (_sequence != 0) {
217 play_rate *= _manager->get_play_rate();
219 S32 percent = (S32)(play_rate * 100.0f);
220 AIL_set_sequence_tempo(_sequence, percent, 0);
229 PN_stdfloat MilesAudioSequence::
231 if (_sequence == 0) {
234 if (!_sd->_has_length) {
237 ((MilesAudioSequence *)
this)->determine_length();
240 return _sd->get_length();
246 AIL_sequence_ms_position(_sequence, &length_ms, NULL);
247 PN_stdfloat time = (PN_stdfloat)length_ms * 0.001f;
256 AudioSound::SoundStatus MilesAudioSequence::
258 if (_sequence == 0) {
259 return AudioSound::READY;
261 switch (AIL_sequence_status(_sequence)) {
265 return AudioSound::READY;
268 case SEQ_PLAYINGBUTRELEASED:
269 return AudioSound::PLAYING;
272 return AudioSound::BAD;
283 void MilesAudioSequence::
295 void MilesAudioSequence::
307 void AILCALLBACK MilesAudioSequence::
308 finish_callback(HSEQUENCE sequence) {
309 MilesAudioSequence *
self = (MilesAudioSequence *)AIL_sequence_user_data(sequence, 0);
310 if (milesAudio_cat.is_debug()) {
311 milesAudio_cat.debug()
312 <<
"finished " << *
self <<
"\n";
314 self->_manager->_sounds_finished =
true;
322 void MilesAudioSequence::
323 do_set_time(PN_stdfloat time) {
324 miles_audio_debug(
"do_set_time(time="<<time<<
")");
326 nassertv(_sequence != 0);
328 S32 time_ms = (S32)(1000.0f * time);
332 AIL_sequence_ms_position(_sequence, &length_ms, NULL);
333 time_ms = min(time_ms, length_ms);
335 AIL_set_sequence_ms_position(_sequence, time_ms);
345 void MilesAudioSequence::
347 nassertv(_sequence == 0);
349 GlobalMilesManager *mgr = GlobalMilesManager::get_global_ptr();
350 if (!mgr->get_sequence(_sequence, _sequence_index,
this)){
351 milesAudio_cat.warning()
352 <<
"Could not determine length of " << _file_name <<
": too many open sequences\n";
355 AIL_init_sequence(_sequence, &_sd->_raw_data[0], 0);
357 AIL_sequence_ms_position(_sequence, &length_ms, NULL);
358 PN_stdfloat time = (PN_stdfloat)length_ms * 0.001f;
359 mgr->release_sequence(_sequence_index,
this);
363 _sd->set_length(time);
TypeHandle is the identifier used to differentiate C++ class types.