Browse Source

fixed to actually work

Cary Sandvig 25 years ago
parent
commit
0f2496a467

+ 18 - 2
panda/src/audio/Sources.pp

@@ -9,11 +9,17 @@
     audio_midi.h audio_music.I audio_music.cxx audio_music.h \
     audio_pool.I audio_pool.cxx audio_pool.h audio_sample.I \
     audio_sample.cxx audio_sample.h audio_trait.cxx audio_trait.h \
-    config_audio.cxx config_audio.h
+    config_audio.cxx config_audio.h audio_mikmod_traits.cxx \
+    audio_mikmod_traits.h audio_win_traits.I audio_win_traits.cxx \
+    audio_win_traits.h audio_null_traits.I audio_null_traits.cxx \
+    audio_null_traits.h audio_linux_traits.I audio_linux_traits.cxx \
+    audio_linux_traits.h
 
   #define INSTALL_HEADERS \
     audio.h audio_manager.h audio_music.h audio_pool.I audio_pool.h \
-    audio_sample.I audio_sample.h audio_trait.h
+    audio_sample.I audio_sample.h audio_trait.h audio_mikmod_traits.h \
+    audio_win_traits.I audio_win_traits.h audio_null_traits.I \
+    audio_null_traits.h audio_linux_traits.I audio_linux_traits.h
 
   #define IGATESCAN audio.h
 
@@ -39,6 +45,16 @@
 
 #end lib_target
 
+// #begin lib_target
+//   #define TARGET audio_load_st
+//   #define LOCAL_LIBS \
+//     audio
+// 
+//   #define SOURCES \
+//     audio_load_st.cxx
+// 
+// #end lib_target
+
 #begin test_bin_target
   #define TARGET test_audio
 

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

@@ -4,6 +4,9 @@
 ////////////////////////////////////////////////////////////////////
 
 #include "audio_linux_traits.h"
+
+#ifdef AUDIO_USE_LINUX
+
 #include "audio_manager.h"
 #include "config_audio.h"
 #include <ipc_thread.h>
@@ -278,3 +281,5 @@ LinuxPlayer* LinuxPlayer::get_instance(void) {
     _global_instance = new LinuxPlayer();
   return _global_instance;
 }
+
+#endif /* AUDIO_USE_LINUX */

+ 6 - 2
panda/src/audio/audio_linux_traits.h

@@ -3,11 +3,14 @@
 // 
 ////////////////////////////////////////////////////////////////////
 
+// yes, this needs to be outside the ifdef protection
+#include "audio_trait.h"
+
+#ifdef AUDIO_USE_LINUX
+
 #ifndef __AUDIO_LINUX_TRAITS_H__
 #define __AUDIO_LINUX_TRAITS_H__
 
-#include "audio_trait.h"
-
 typedef unsigned char byte;
 
 class EXPCL_PANDA Buffer {
@@ -86,3 +89,4 @@ private:
 #include "audio_linux_traits.I"
 
 #endif /* __AUDIO_LINUX_TRAITS_H__ */
+#endif /* AUDIO_USE_LINUX */

+ 33 - 6
panda/src/audio/audio_load_midi.cxx

@@ -6,10 +6,11 @@
 #include <dconfig.h>
 #include "audio_pool.h"
 #include "config_audio.h"
+#include "audio_trait.h"
 
 Configure(audio_load_midi);
 
-#ifdef USE_MIKMOD
+#ifdef AUDIO_USE_MIKMOD
 
 #include "audio_mikmod_traits.h"
 
@@ -27,9 +28,9 @@ void AudioLoadMidi(AudioTraits::MusicClass** music,
   *destroy = AudioDestroyMidi;
 }
 
-#else
+#else /* AUDIO_USE_MIKMOD */
 
-#ifdef PENV_WIN32
+#ifdef AUDIO_USE_WIN32
 
 #include "audio_win_traits.h"
 
@@ -49,7 +50,27 @@ void AudioLoadMidi(AudioTraits::MusicClass** music,
 		     << "  player = " << (void*)*player << "  destroy = "
 		     << (void*)*destroy << endl;
 }
-#else
+#else /* AUDIO_USE_WIN32 */
+
+#ifdef AUDIO_USE_LINUX
+
+void AudioDestroyMidi(AudioTraits::MusicClass* music) {
+  delete music;
+}
+
+void AudioLoadMidi(AudioTraits::MusicClass** music,
+		   AudioTraits::PlayerClass** player,
+		   AudioTraits::DeleteMusicFunc** destroy, Filename) {
+  audio_cat->warning() << "linux doesn't support reading midi data yet"
+		       << endl;
+  *music = (AudioTraits::MusicClass*)0L;
+  *player = (AudioTraits::PlayerClass*)0L;
+  *destroy = AudioDestroyMidi;
+}
+
+#else /* AUDIO_USE_LINUX */
+
+#ifdef AUDIO_USE_NULL
 
 // Null driver
 #include "audio_null_traits.h"
@@ -66,8 +87,14 @@ void AudioLoadMidi(AudioTraits::MusicClass** music,
   *destroy = AudioDestroyMidi;
 }
 
-#endif /* win32 */
-#endif /* mikmod */
+#else /* AUDIO_USE_NULL */
+
+#error "unknown driver type"
+
+#endif /* AUDIO_USE_NULL */
+#endif /* AUDIO_USE_LINUX */
+#endif /* AUDIO_USE_WIN32 */
+#endif /* AUDIO_USE_MIKMOD */
 
 ConfigureFn(audio_load_midi) {
   AudioPool::register_music_loader("midi", AudioLoadMidi);

+ 19 - 11
panda/src/audio/audio_load_st.cxx

@@ -6,9 +6,10 @@
 #include <config.h>
 #include "audio_pool.h"
 #include "config_audio.h"
+#include "audio_trait.h"
 
-#include <st.h>
-#include <patchlvl.h>
+#include <sox/st.h>
+#include <sox/patchlvl.h>
 
 #if (PATCHLEVEL == 16)
 #define FORMATS formats
@@ -220,7 +221,7 @@ static byte* read_file(Filename filename) {
   return ret;
 }
 
-#ifdef USE_MIKMOD
+#ifdef AUDIO_USE_MIKMOD
 
 void AudioDestroySt(AudioTraits::SampleClass* sample) {
   delete sample;
@@ -236,9 +237,9 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
   *destroy = AudioDestroySt;
 }
 
-#else /* no MikMod */
+#else /* AUDIO_USE_MIKMOD */
 
-ifdef PENV_WIN32
+#ifdef AUDIO_USE_WIN32
 
 void AudioDestroySt(AudioTraits::SampleClass* sample) {
   delete sample;
@@ -254,9 +255,9 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
   *destroy = AudioDestroySt;
 }
 
-#else /* no win32 */
+#else /* AUDIO_USE_WIN32 */
 
-#ifdev PENV_LINUX
+#ifdef AUDIO_USE_LINUX
 
 void AudioDestroySt(AudioTraits::SampleClass* sample) {
   delete sample;
@@ -272,7 +273,9 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
   *destroy = AudioDestroySt;
 }
 
-#else /* no linux */
+#else /* AUDIO_USE_LINUX */
+
+#ifdef AUDIO_USE_NULL
 
 // Null driver
 #include "audio_null_traits.h"
@@ -289,9 +292,14 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
   *destroy = AudioDestroySt;
 }
 
-#endif /* linux */
-#endif /* win32 */
-#endif /* MikMod */
+#else /* AUDIO_USE_NULL */
+
+#error "unknown audio driver type"
+
+#endif /* AUDIO_USE_NULL */
+#endif /* AUDIO_USE_LINUX */
+#endif /* AUDIO_USE_WIN32 */
+#endif /* AUDIO_USE_MIKMOD */
 
 ConfigureFn(audio_load_st) {
   for (int i=0; FORMATS[i].names != (char**)0L; ++i)

+ 32 - 6
panda/src/audio/audio_load_wav.cxx

@@ -8,7 +8,9 @@
 
 Configure(audio_load_wav);
 
-#ifdef USE_MIKMOD
+#include "audio_trait.h"
+
+#ifdef AUDIO_USE_MIKMOD
 
 #include "audio_mikmod_traits.h"
 
@@ -26,9 +28,9 @@ void AudioLoadWav(AudioTraits::SampleClass** sample,
   *destroy = AudioDestroyWav;
 }
 
-#else /* no MikMod */
+#else /* AUDIO_USE_MIKMOD */
 
-#ifdef PENV_WIN32
+#ifdef AUDIO_USE_WIN32
 
 #include "audio_win_traits.h"
 
@@ -46,7 +48,25 @@ void AudioLoadWav(AudioTraits::SampleClass** sample,
   *destroy = AudioDestroyWav;
 }
 
-#else /* no win32 */
+#else /* AUDIO_USE_WIN32 */
+
+#ifdef AUDIO_USE_LINUX
+
+void AudioDestroyWav(AudioTraits::SampleClass* sample) {
+  delete sample;
+}
+
+void AudioLoadWav(AudioTraits::SampleClass** sample,
+		  AudioTraits::PlayerClass** player,
+		  AudioTraits::DeleteSampleFunc** destroy, Filename) {
+  *sample = (AudioTraits::SampleClass*)0L;
+  *player = (audioTraits::PlayerClass*)0L;
+  *destroy = AudioDestroyWav;
+}
+
+#else /* AUDIO_USE_LINUX */
+
+#ifdef AUDIO_USE_NULL
 
 // Null driver
 #include "audio_null_traits.h"
@@ -63,8 +83,14 @@ void AudioLoadWav(AudioTraits::SampleClass** sample,
   *destroy = AudioDestroyWav;
 }
 
-#endif /* win32 */
-#endif /* MikMod */
+#else /* AUDIO_USE_NULL */
+
+#error "unknown implementation driver"
+
+#endif /* AUDIO_USE_NULL */
+#endif /* AUDIO_USE_LINUX */
+#endif /* AUDIO_USE_WIN32 */
+#endif /* AUDIO_USE_MIKMOD */
 
 ConfigureFn(audio_load_wav) {
   AudioPool::register_sample_loader("wav", AudioLoadWav);

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

@@ -4,6 +4,9 @@
 ////////////////////////////////////////////////////////////////////
 
 #include "audio_mikmod_traits.h"
+
+#ifdef AUDIO_USE_MIKMOD
+
 #include "audio_manager.h"
 #include "config_audio.h"
 #include <list>
@@ -303,3 +306,5 @@ MikModMidiPlayer* MikModMidiPlayer::get_instance(void) {
     _global_instance = new MikModMidiPlayer();
   return _global_instance;
 }
+
+#endif /* AUDIO_USE_MIKMOD */

+ 5 - 1
panda/src/audio/audio_mikmod_traits.h

@@ -3,10 +3,13 @@
 // 
 ////////////////////////////////////////////////////////////////////
 
+// yes, this should be outside
+#include "audio_trait.h"
+
+#ifdef AUDIO_USE_MIKMOD
 #ifndef __AUDIO_MIKMOD_TRAITS_H__
 #define __AUDIO_MIKMOD_TRAITS_H__
 
-#include "audio_trait.h"
 #include <pandabase.h>
 #include <filename.h>
 #include <mikmod.h>
@@ -100,3 +103,4 @@ private:
 };
 
 #endif /* __AUDIO_MIKMOD_TRAITS_H__ */
+#endif /* AUDIO_USE_MIKMOD */

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

@@ -4,6 +4,9 @@
 ////////////////////////////////////////////////////////////////////
 
 #include "audio_null_traits.h"
+
+#ifdef AUDIO_USE_NULL
+
 #include "audio_manager.h"
 #include "config_audio.h"
 
@@ -68,3 +71,5 @@ void NullPlayer::set_volume(AudioTraits::MusicClass*, int) {
   if (audio_cat->is_debug())
     audio_cat->debug() << "in set volume (music) in Null audio driver" << endl;
 }
+
+#endif /* AUDIO_USE_NULL */

+ 6 - 2
panda/src/audio/audio_null_traits.h

@@ -3,11 +3,14 @@
 // 
 ////////////////////////////////////////////////////////////////////
 
+// yes, this needs to be outside the ifdef protection
+#include "audio_trait.h"
+
+#ifdef AUDIO_USE_NULL
+
 #ifndef __AUDIO_NULL_TRAITS_H__
 #define __AUDIO_NULL_TRAITS_H__
 
-#include "audio_trait.h"
-
 class EXPCL_PANDA NullSample : public AudioTraits::SampleClass {
 public:
   INLINE NullSample(void);
@@ -39,3 +42,4 @@ public:
 #include "audio_null_traits.I"
 
 #endif /* __AUDIO_NULL_TRAITS_H__ */
+#endif /* AUDIO_USE_NULL */

+ 21 - 0
panda/src/audio/audio_trait.h

@@ -46,4 +46,25 @@ public:
   };
 };
 
+// this is really ugly.  But since we have to be able to include/compile
+// all of the driver files on any system, I need to centralize a switch
+// for which one is real.
+#ifdef HAVE_MIKMOD
+#define AUDIO_USE_MIKMOD
+#else /* HAVE_MIKMOD */
+#ifdef PENV_WIN32
+#define AUDIO_USE_WIN32
+#else /* PENV_WIN32 */
+/*
+#ifdef PENV_LINUX
+#define AUDIO_USE_LINUX
+#else /* PENV_LINUX *
+*/
+#define AUDIO_USE_NULL
+/*
+#endif /* PENV_LINUX *
+*/
+#endif /* PENV_WIN32 */
+#endif /* HAVE_MIKMOD */
+
 #endif /* __AUDIO_TRAIT_H__ */

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

@@ -4,6 +4,9 @@
 ////////////////////////////////////////////////////////////////////
 
 #include "audio_win_traits.h"
+
+#ifdef AUDIO_USE_WIN32
+
 #include "audio_manager.h"
 #include "config_audio.h"
 
@@ -658,3 +661,5 @@ WinPlayer* WinPlayer::get_instance(void) {
     _global_instance = new WinPlayer();
   return _global_instance;
 }
+
+#endif /* AUDIO_USE_WIN32 */

+ 5 - 1
panda/src/audio/audio_win_traits.h

@@ -3,10 +3,13 @@
 // 
 ////////////////////////////////////////////////////////////////////
 
+// yes, this needs to be outside the ifdef protection
+#include "audio_trait.h"
+
+#ifdef AUDIO_USE_WIN32
 #ifndef __AUDIO_WIN_TRAITS_H__
 #define __AUDIO_WIN_TRAITS_H__
 
-#include "audio_trait.h"
 #include <filename.h>
 
 #include <windows.h>
@@ -76,3 +79,4 @@ private:
 #include "audio_win_traits.I"
 
 #endif /* __AUDIO_WIN_TRAITS_H__ */
+#endif /* AUDIO_USE_WIN32 */

+ 17 - 0
panda/src/audio/config_audio.cxx

@@ -7,6 +7,8 @@
 #include "audio_sample.h"
 #include "audio_music.h"
 #include <dconfig.h>
+#include <filename.h>
+#include <load_dso.h>
 
 Configure(config_audio);
 NotifyCategoryDef(audio, "");
@@ -16,6 +18,8 @@ int audio_mix_freq = config_audio.GetInt("audio-mix-freq", 11025);
 string* audio_mode_flags;
 int audio_driver_select = config_audio.GetInt("audio-driver-select", 0);
 string* audio_driver_params;
+int audio_buffer_size = config_audio.GetInt("audio-buffer-size", 4096);
+string* audio_device;
 
 ConfigureFn(config_audio) {
   AudioSample::init_type();
@@ -38,4 +42,17 @@ ConfigureFn(config_audio) {
       *audio_driver_params += " ";
     *audio_driver_params += (*i).Val();
   }
+
+  Config::ConfigTable::Symbol loaders;
+  config_audio.GetAll("audio-loader", loaders);
+  for (i=loaders.begin(); i!=loaders.end(); ++i) {
+    Filename dlname = Filename::dso_filename("libaudio_load_" + (*i).Val() +
+					     ".so");
+    audio_cat->info() << "loading '" << (*i).Val() << "' loader" << endl;
+    void* tmp = load_dso(dlname.to_os_specific());
+    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"));
 }

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

@@ -16,5 +16,7 @@ extern int audio_mix_freq;
 extern string* audio_mode_flags;
 extern int audio_driver_select;
 extern string* audio_driver_params;
+extern int audio_buffer_size;
+extern string* audio_device;
 
 #endif /* __CONFIG_AUDIO_H__ */