Browse Source

rev for playing state

Cary Sandvig 25 years ago
parent
commit
eed2cb7fa5

+ 7 - 3
panda/src/audio/audio_linux_traits.I

@@ -3,15 +3,19 @@
 // 
 ////////////////////////////////////////////////////////////////////
 
-INLINE LinuxSample::LinuxSample(Buffer* b) : _data(b) {
+INLINE LinuxSample::LinuxSample(Buffer* b) : AudioTraits::SampleClass(),
+					     _data(b) {
 }
 
 INLINE Buffer* LinuxSample::get_data(void) {
   return _data;
 }
 
-INLINE LinuxMusic::LinuxMusic(void) {
+INLINE LinuxMusic::LinuxMusic(void) : AudioTraits::MusicClass() {
 }
 
-INLINE LinuxPlayer::LinuxPlayer(void) {
+INLINE LinuxPlaying::LinuxPlaying(void) : AudioTraits::PlayingClass() {
+}
+
+INLINE LinuxPlayer::LinuxPlayer(void) : AudioTraits::PlayerClass() {
 }

+ 19 - 0
panda/src/audio/audio_linux_traits.cxx

@@ -243,6 +243,10 @@ AudioTraits::SampleClass::SampleStatus LinuxSample::status(void) {
   return AudioTraits::SampleClass::READY;
 }
 
+LinuxPlaying* LinuxSample::get_state(void) {
+  return new LinuxPlaying();
+}
+
 void LinuxSample::destroy(AudioTraits::SampleClass* sample) {
   delete sample;
 }
@@ -259,6 +263,21 @@ AudioTraits::MusicClass::MusicStatus LinuxMusic::status(void) {
   return AudioTraits::MusicClass::READY;
 }
 
+LinuxPlaying* LinuxMusic::get_state(void) {
+  return new LinuxPlaying();
+}
+
+void LinuxMusic::destroy(AudioTraits::MusicClass* music) {
+  delete music;
+}
+
+LinuxPlaying::~LinuxPlaying(void) {
+}
+
+AudioTraits::PlayingClass::PlayingStatus LinuxPlaying::status(void) {
+  return AudioTraits::PlayingClass::BAD;
+}
+
 LinuxPlayer* LinuxPlayer::_global_instance = (LinuxPlayer*)0L;
 
 LinuxPlayer::~LinuxPlayer(void) {

+ 15 - 1
panda/src/audio/audio_linux_traits.h

@@ -57,6 +57,8 @@ public:
   }
 };
 
+class LinuxPlaying;
+
 class EXPCL_PANDA LinuxSample : public AudioTraits::SampleClass {
 private:
   Buffer* _data;
@@ -67,10 +69,11 @@ public:
   virtual float length(void);
   virtual AudioTraits::SampleClass::SampleStatus status(void);
 
-  static void destroy(AudioTraits::SampleClass*);
 public:
   // used by the loader
   static LinuxSample* load_raw(byte*, unsigned long);
+  virtual LinuxPlaying* get_state(void);
+  static void destroy(AudioTraits::SampleClass*);
   // used by the players
   INLINE Buffer* get_data(void);
 };
@@ -81,6 +84,17 @@ public:
   virtual ~LinuxMusic(void);
 
   virtual AudioTraits::MusicClass::MusicStatus status(void);
+public:
+  virtual LinuxPlaying* get_state(void);
+  static void destroy(AudioTraits::MusicClass*);
+};
+
+class EXPCL_PANDA LinuxPlaying : public AudioTraits::PlayingClass {
+public:
+  INLINE LinuxPlaying(void);
+  virtual ~LinuxPlaying(void);
+
+  virtual AudioTraits::PlayingClass::PlayingStatus status(void);
 };
 
 class EXPCL_PANDA LinuxPlayer : public AudioTraits::PlayerClass {

+ 14 - 0
panda/src/audio/audio_mikmod_traits.cxx

@@ -156,6 +156,10 @@ MikModSample* MikModSample::load_wav(Filename filename) {
   return new MikModSample(sample);
 }
 
+MikModPlaying* MikModSample::get_state(void) {
+  return new MikModPlaying();
+}
+
 void MikModSample::destroy(AudioTraits::SampleClass* sample) {
   delete sample;
 }
@@ -197,6 +201,10 @@ MikModMidi* MikModMidi::load_midi(Filename) {
   return new MikModMidi();
 }
 
+MikModPlaying* MikModMidi::get_state(void) {
+  return new MikModPlaying();
+}
+
 void MikModMidi::destroy(AudioTraits::MusicClass* music) {
   delete music;
 }
@@ -205,6 +213,12 @@ AudioTraits::MusicClass::MusicStatus MikModMidi::status(void) {
   return READY;
 }
 
+MikModPlaying::MikModPlaying(void) : AudioTraits::PlayingClass() {
+}
+
+MikModPlaying::~MikModPlaying(void) {
+}
+
 MikModSamplePlayer* MikModSamplePlayer::_global_instance =
     (MikModSamplePlayer*)0L;
 

+ 10 - 0
panda/src/audio/audio_mikmod_traits.h

@@ -14,6 +14,8 @@
 #include <filename.h>
 #include <mikmod.h>
 
+class MikModPlaying;
+
 class EXPCL_PANDA MikModSample : public AudioTraits::SampleClass {
 private:
   SAMPLE* _sample;
@@ -28,6 +30,7 @@ public:
 public:
   // used by the readers
   static MikModSample* load_wav(Filename);
+  virtual MikModPlaying* get_state(void);
   static void destroy(AudioTraits::SampleClass*);
   // used by the players
   virtual void set_voice(int);
@@ -57,8 +60,15 @@ public:
   // used by the readers
   static MikModMidi* load_midi(Filename);
   static void destroy(AudioTraits::MusicClass*);
+  virtual MikModPlaying* get_state(void);
 };
 
+class EXPCL_PANDA MikModPlaying : public AudioTraits::PlayingClass {
+public:
+  MikModPlaying(void);
+  ~MikModPlaying(void);
+}
+
 class EXPCL_PANDA MikModSamplePlayer : public AudioTraits::PlayerClass {
 public:
   MikModSamplePlayer(void);

+ 6 - 3
panda/src/audio/audio_null_traits.I

@@ -3,11 +3,14 @@
 // 
 ////////////////////////////////////////////////////////////////////
 
-INLINE NullSample::NullSample(void) {
+INLINE NullSample::NullSample(void) : AudioTraits::SampleClass() {
 }
 
-INLINE NullMusic::NullMusic(void) {
+INLINE NullMusic::NullMusic(void) : AudioTraits::MusicClass() {
 }
 
-INLINE NullPlayer::NullPlayer(void) {
+INLINE NullPlaying::NullPlaying(void) : AudioTraits::PlayingClass() {
+}
+
+INLINE NullPlayer::NullPlayer(void) : AudioTraits::PlayerClass() {
 }

+ 3 - 0
panda/src/audio/audio_null_traits.cxx

@@ -48,6 +48,9 @@ AudioTraits::MusicClass::MusicStatus NullMusic::status(void) {
   return READY;
 }
 
+NullPlaying::~NullPlaying(void) {
+}
+
 NullPlayer::~NullPlayer(void) {
 }
 

+ 8 - 0
panda/src/audio/audio_null_traits.h

@@ -11,6 +11,8 @@
 #ifndef __AUDIO_NULL_TRAITS_H__
 #define __AUDIO_NULL_TRAITS_H__
 
+class NullPlaying;
+
 class EXPCL_PANDA NullSample : public AudioTraits::SampleClass {
 public:
   INLINE NullSample(void);
@@ -28,6 +30,12 @@ public:
   virtual AudioTraits::MusicClass::MusicStatus status(void);
 };
 
+class EXPCL_PANDA NullPlaying : public AudioTraits::PlayingClass {
+public:
+  INLINE NullPlaying(void);
+  virtual ~NullPlaying(void);
+};
+
 class EXPCL_PANDA NullPlayer : public AudioTraits::PlayerClass {
 public:
   INLINE NullPlayer(void);

+ 10 - 8
panda/src/audio/audio_pool.cxx

@@ -78,6 +78,7 @@ AudioSample* AudioPool::ns_load_sample(Filename filename) {
   }
   audio_cat.info() << "Loading sample " << filename << "\n";
   AudioTraits::SampleClass* sample = (AudioTraits::SampleClass*)0L;
+  AudioTraits::PlayingClass* state = (AudioTraits::PlayingClass*)0L;
   AudioTraits::PlayerClass* player = (AudioTraits::PlayerClass*)0L;
   AudioTraits::DeleteSampleFunc* destroy = (AudioTraits::DeleteSampleFunc*)0L;
   string ext = filename.get_extension();
@@ -89,16 +90,16 @@ AudioSample* AudioPool::ns_load_sample(Filename filename) {
 		       << "'" << endl;
     return (AudioSample*)0L;
   }
-  (*((*sli).second))(&sample, &player, &destroy, filename);
+  (*((*sli).second))(&sample, &state, &player, &destroy, filename);
   if ((sample == (AudioTraits::SampleClass*)0L) ||
+      (state == (AudioTraits::PlayingClass*)0L) ||
       (player == (AudioTraits::PlayerClass*)0L) ||
       (destroy == (AudioTraits::DeleteSampleFunc*)0L)) {
     audio_cat->error() << "could not load '" << filename << "'" << endl;
     return (AudioSample*)0L;
   }
-  PT(AudioSample) the_sample = new AudioSample(sample,
-					       (AudioTraits::PlayingClass*)0L,
-					       player, destroy, filename);
+  PT(AudioSample) the_sample = new AudioSample(sample, state, player, destroy,
+					       filename);
   _samples[filename] = the_sample;
   return the_sample;
 }
@@ -178,6 +179,7 @@ AudioMusic* AudioPool::ns_load_music(Filename filename) {
   }
   audio_cat.info() << "Loading music " << filename << "\n";
   AudioTraits::MusicClass* music = (AudioTraits::MusicClass*)0L;
+  AudioTraits::PlayingClass* state = (AudioTraits::PlayingClass*)0L;
   AudioTraits::PlayerClass* player = (AudioTraits::PlayerClass*)0L;
   AudioTraits::DeleteMusicFunc* destroy = (AudioTraits::DeleteMusicFunc*)0L;
   string ext = filename.get_extension();
@@ -189,16 +191,16 @@ AudioMusic* AudioPool::ns_load_music(Filename filename) {
 		       << "'" << endl;
     return (AudioMusic*)0L;
   }
-  (*((*sli).second))(&music, &player, &destroy, filename);
+  (*((*sli).second))(&music, &state, &player, &destroy, filename);
   if ((music == (AudioTraits::MusicClass*)0L) ||
+      (state == (AudioTraits::PlayingClass*)0L) ||
       (player == (AudioTraits::PlayerClass*)0L) ||
       (destroy == (AudioTraits::DeleteMusicFunc*)0L)) {
     audio_cat->error() << "could not load '" << filename << "'" << endl;
     return (AudioMusic*)0L;
   }
-  PT(AudioMusic) the_music = new AudioMusic(music,
-					    (AudioTraits::PlayingClass*)0L,
-					    player, destroy, filename);
+  PT(AudioMusic) the_music = new AudioMusic(music, state, player, destroy,
+					    filename);
   _music[filename] = the_music;
   return the_music;
 }

+ 2 - 0
panda/src/audio/audio_pool.h

@@ -36,6 +36,7 @@ private:
   MusicMap _music;
 public:
   typedef void SampleLoadFunc(AudioTraits::SampleClass**,
+			      AudioTraits::PlayingClass**,
 			      AudioTraits::PlayerClass**,
 			      AudioTraits::DeleteSampleFunc**, Filename);
 
@@ -47,6 +48,7 @@ public:
   static void register_sample_loader(const string&, SampleLoadFunc*);
 
   typedef void MusicLoadFunc(AudioTraits::MusicClass**,
+			     AudioTraits::PlayingClass**,
 			     AudioTraits::PlayerClass**,
 			     AudioTraits::DeleteMusicFunc**, Filename);
 

+ 8 - 3
panda/src/audio/audio_win_traits.I

@@ -3,14 +3,16 @@
 // 
 ////////////////////////////////////////////////////////////////////
 
-INLINE WinSample::WinSample(void) : _channel(NULL), _data(NULL), _len(0) {
+INLINE WinSample::WinSample(void) : AudioTraits::SampleClass(), _channel(NULL),
+				    _data(NULL), _len(0) {
 }
 
 INLINE LPDIRECTSOUNDBUFFER WinSample::get_channel(void) {
   return _channel;
 }
 
-INLINE WinMusic::WinMusic(void) : _performance(NULL), _music(NULL),
+INLINE WinMusic::WinMusic(void) : AudioTraits::MusicClass(),
+				  _performance(NULL), _music(NULL),
 				  _buffer(NULL), _synth(NULL), _data(NULL),
 				  _len(0) {
   init();
@@ -24,5 +26,8 @@ INLINE IDirectMusicSegment* WinMusic::get_music(void) {
   return _music;
 }
 
-INLINE WinPlayer::WinPlayer(void) {
+INLINE WinPlaying::WinPlaying(void) : AudioTraits::PlayingClass() {
+}
+
+INLINE WinPlayer::WinPlayer(void) : AudioTraits::PlayerClass() {
 }

+ 11 - 0
panda/src/audio/audio_win_traits.cxx

@@ -443,6 +443,10 @@ WinSample* WinSample::load_raw(unsigned char* data, unsigned long size) {
   }
 }
 
+WinPlaying* WinSample::get_state(void) {
+  return new WinPlaying();
+}
+
 void WinSample::destroy(AudioTraits::SampleClass* sample) {
   delete sample;
 }
@@ -638,6 +642,10 @@ WinMusic* WinMusic::load_midi(Filename filename) {
   return ret;
 }
 
+WinPlaying* WinMusic::get_state(void) {
+  return new WinPlaying();
+}
+
 void WinMusic::destroy(AudioTraits::MusicClass* music) {
   if (audio_cat->is_debug())
     audio_cat->debug() << "in WinMusic::destroy()" << endl;
@@ -646,6 +654,9 @@ void WinMusic::destroy(AudioTraits::MusicClass* music) {
     audio_cat->debug() << "out of WinMusic::destroy()" << endl;
 }
 
+WinPlaying::~WinPlaying(void) {
+}
+
 WinPlayer* WinPlayer::_global_instance = (WinPlayer*)0L;
 
 WinPlayer::~WinPlayer(void) {

+ 10 - 0
panda/src/audio/audio_win_traits.h

@@ -16,6 +16,8 @@
 #include <dsound.h>
 #include <dmusici.h>
 
+class WinPlaying;
+
 class EXPCL_PANDA WinSample : public AudioTraits::SampleClass {
 private:
   LPDIRECTSOUNDBUFFER _channel;
@@ -33,6 +35,7 @@ public:
   void  unlock(void);
   static WinSample* load_wav(Filename);
   static WinSample* load_raw(unsigned char*, unsigned long);
+  virtual WinPlaying* get_state(void);
   static void destroy(AudioTraits::SampleClass*);
   // these are used by the player
   INLINE LPDIRECTSOUNDBUFFER get_channel(void);
@@ -55,12 +58,19 @@ public:
   virtual AudioTraits::MusicClass::MusicStatus status(void);
   // these are used by the loaders
   static WinMusic* load_midi(Filename);
+  virtual WinPlaying* get_state(void);
   static void destroy(AudioTraits::MusicClass*);
   // these are used by the players
   INLINE IDirectMusicPerformance* get_performance(void);
   INLINE IDirectMusicSegment* get_music(void);
 };
 
+class EXPCL_PANDA WinPlaying : public AudioTraits::PlayingClass {
+public:
+  INLINE WinPlaying(void);
+  ~WinPlaying(void);
+};
+
 class EXPCL_PANDA WinPlayer : public AudioTraits::PlayerClass {
 public:
   INLINE WinPlayer(void);

+ 12 - 4
panda/src/audiotraits/audio_load_midi.cxx

@@ -19,11 +19,13 @@ void AudioDestroyMidi(AudioTraits::MusicClass* music) {
 }
 
 void AudioLoadMidi(AudioTraits::MusicClass** music,
+		   AudioTraits::PlayingClass** state,
 		   AudioTraits::PlayerClass** player,
 		   AudioTraits::DeleteMusicFunc** destroy, Filename filename) {
   *music = MikModMidi::load_midi(filename);
   if (*music == (AudioTraits::MusicClass*)0L)
     return;
+  *state = *music->get_state();
   *player = MikModMidiPlayer::get_instance();
   *destroy = AudioDestroyMidi;
 }
@@ -39,31 +41,35 @@ void AudioDestroyMidi(AudioTraits::MusicClass* music) {
 }
 
 void AudioLoadMidi(AudioTraits::MusicClass** music,
+		   AudioTraits::PlayingClass** state,
 		   AudioTraits::PlayerClass** player,
 		   AudioTraits::DeleteMusicFunc** destroy, Filename filename) {
   *music = WinMusic::load_midi(filename);
   if (*music == (AudioTraits::MusicClass*)0L)
     return;
+  *state = *music->get_state();
   *player = WinPlayer::get_instance();
   *destroy = AudioDestroyMidi;
-  audio_cat->debug() << "sanity check: music = " << (void*)*music
-		     << "  player = " << (void*)*player << "  destroy = "
-		     << (void*)*destroy << endl;
 }
+
 #else /* AUDIO_USE_WIN32 */
 
 #ifdef AUDIO_USE_LINUX
 
+#include "audio_linux_traits.h"
+
 void AudioDestroyMidi(AudioTraits::MusicClass* music) {
-  delete music;
+  LinuxMusic::destroy(music);
 }
 
 void AudioLoadMidi(AudioTraits::MusicClass** music,
+		   AudioTraits::PlayingClass** state,
 		   AudioTraits::PlayerClass** player,
 		   AudioTraits::DeleteMusicFunc** destroy, Filename) {
   audio_cat->warning() << "linux doesn't support reading midi data yet"
 		       << endl;
   *music = (AudioTraits::MusicClass*)0L;
+  *state = (AudioTraits::PlayingClass*)0L;
   *player = (AudioTraits::PlayerClass*)0L;
   *destroy = AudioDestroyMidi;
 }
@@ -80,9 +86,11 @@ void AudioDestroyMidi(AudioTraits::MusicClass* music) {
 }
 
 void AudioLoadMidi(AudioTraits::MusicClass** music,
+		   AudioTraits::PlayingClass** state,
 		   AudioTraits::PlayerClass** player,
 		   AudioTraits::DeleteMusicFunc** destroy, Filename) {
   *music = new NullMusic();
+  *state = new NullPlaying();
   *player = new NullPlayer();
   *destroy = AudioDestroyMidi;
 }

+ 12 - 2
panda/src/audiotraits/audio_load_st.cxx

@@ -386,11 +386,13 @@ void AudioDestroySt(AudioTraits::SampleClass* sample) {
 }
 
 void AudioLoadSt(AudioTraits::SampleClass** sample,
+		 AudioTraits::PlayingClass** state,
 		 AudioTraits::PlayerClass** player,
 		 AudioTraits::DeleteSampleFunc** destroy, Filename) {
   audio_cat->warning() << "MikMod doesn't support reading raw data yet"
 		       << endl;
   *sample = (AudioTraits::SampleClass*)0L;
+  *state = (AudioTraits::PlayingClass*)0L;
   *player = (AudioTraits::PlayerClass*)0L;
   *destroy = AudioDestroySt;
 }
@@ -402,10 +404,11 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
 #include "audio_win_traits.h"
 
 void AudioDestroySt(AudioTraits::SampleClass* sample) {
-  delete sample;
+  WinSample::destroy(sample);
 }
 
 void AudioLoadSt(AudioTraits::SampleClass** sample,
+		 AudioTraits::PlayingClass** state,
 		 AudioTraits::PlayerClass** player,
 		 AudioTraits::DeleteSampleFunc** destroy, Filename filename) {
 #ifdef HAVE_SOXST
@@ -414,11 +417,13 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
   read_file(filename, &buf, len);
   if (buf != (unsigned char*)0L) {
     *sample = WinSample::load_raw(buf, len);
+    *state = ((WinSample*)(*sample))->get_state();
     *player = WinPlayer::get_instance();
     *destroy = AudioDestroySt;
   }
 #else /* HAVE_SOXST */
   *sample = (AudioTraits::SampleClass*)0L;
+  *state = (AudioTraits::PlayingClass*)0L;
   *player = (AudioTraits::PlayerClass*)0L;
   *destroy = AudioDestroySt;
 #endif /* HAVE_SOXST */
@@ -431,10 +436,11 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
 #include "audio_linux_traits.h"
 
 void AudioDestroySt(AudioTraits::SampleClass* sample) {
-  delete sample;
+  LinuxSample::destroy(sample);
 }
 
 void AudioLoadSt(AudioTraits::SampleClass** sample,
+		 AudioTraits::PlayingClass** state,
 		 AudioTraits::PlayerClass** player,
 		 AudioTraits::DeleteSampleFunc** destroy, Filename filename) {
 #ifdef HAVE_SOXST
@@ -443,11 +449,13 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
   read_file(filename, &buf, len);
   if (buf != (byte*)0L) {
     *sample = LinuxSample::load_raw(buf, len);
+    *state = ((LinuxSample*)(*sample))->get_state();
     *player = LinuxPlayer::get_instance();
     *destroy = AudioDestroySt;
   }
 #else /* HAVE_SOXST */
   *sample = (AudioTraits::SampleClass*)0L;
+  *state = (AudioTraits::PlayingClass*)0L;
   *player = (AudioTraits::PlayerClass*)0L;
   *destroy = AudioDestroySt;
 #endif /* HAVE_SOXST */
@@ -465,9 +473,11 @@ void AudioDestroySt(AudioTraits::SampleClass* sample) {
 }
 
 void AudioLoadSt(AudioTraits::SampleClass** sample,
+		 AudioTraits::PlayingClass** state,
 		 AudioTraits::PlayerClass** player,
 		 AudioTraits::DeleteSampleFunc** destroy, Filename) {
   *sample = new NullSample();
+  *state = new NullPlaying();
   *player = new NullPlayer();
   *destroy = AudioDestroySt;
 }

+ 13 - 3
panda/src/audiotraits/audio_load_wav.cxx

@@ -20,11 +20,13 @@ void AudioDestroyWav(AudioTraits::SampleClass* sample) {
 }
 
 void AudioLoadWav(AudioTraits::SampleClass** sample,
+		  AudioTraits::PlayingClass** state,
 		  AudioTraits::PlayerClass** player,
 		  AudioTraits::DeleteSampleFunc** destroy, Filename filename) {
   *sample = MikModSample::load_wav(filename);
   if (*sample == (AudioTraits::SampleClass*)0L)
     return;
+  *state = *sample->get_state();
   *player = MikModSamplePlayer::get_instance();
   *destroy = AudioDestroyWav;
 }
@@ -40,11 +42,13 @@ void AudioDestroyWav(AudioTraits::SampleClass* sample) {
 }
 
 void AudioLoadWav(AudioTraits::SampleClass** sample,
+		  AudioTraits::PlayingClass** state,
 		  AudioTraits::PlayerClass** player,
 		  AudioTraits::DeleteSampleFunc** destroy, Filename filename) {
   *sample = WinSample::load_wav(filename);
   if (*sample == (AudioTraits::SampleClass*)0L)
     return;
+  *state = *sample->get_state();
   *player = WinPlayer::get_instance();
   *destroy = AudioDestroyWav;
 }
@@ -53,14 +57,20 @@ void AudioLoadWav(AudioTraits::SampleClass** sample,
 
 #ifdef AUDIO_USE_LINUX
 
+#include "audio_linux_traits.h"
+
 void AudioDestroyWav(AudioTraits::SampleClass* sample) {
-  delete sample;
+  LinuxSample::destroy(sample);
 }
 
 void AudioLoadWav(AudioTraits::SampleClass** sample,
+		  AudioTraits::PlayingClass** state,
 		  AudioTraits::PlayerClass** player,
 		  AudioTraits::DeleteSampleFunc** destroy, Filename) {
+  audio_cat->error() << "Linux driver does not natively support WAV."
+		     << "  Try the 'st' loader." << endl;
   *sample = (AudioTraits::SampleClass*)0L;
+  *state = (AudioTraits::PlayingClass*)0L;
   *player = (AudioTraits::PlayerClass*)0L;
   *destroy = AudioDestroyWav;
 }
@@ -77,11 +87,11 @@ void AudioDestroyWav(AudioTraits::SampleClass* sample) {
 }
 
 void AudioLoadWav(AudioTraits::SampleClass** sample,
+		  AudioTraits::PlayingClass** state,
 		  AudioTraits::PlayerClass** player,
 		  AudioTraits::DeleteSampleFunc** destroy, Filename) {
-  audio_cat->error() << "Linux driver does not natively support WAV."
-		     << "  Try the 'st' loader." << endl;
   *sample = new NullSample();
+  *state = new NullPlaying();
   *player = new NullPlayer();
   *destroy = AudioDestroyWav;
 }