summaryrefslogtreecommitdiffstats
path: root/mpg123_artsplugin/mpg123PlayObject_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'mpg123_artsplugin/mpg123PlayObject_impl.h')
-rw-r--r--mpg123_artsplugin/mpg123PlayObject_impl.h111
1 files changed, 111 insertions, 0 deletions
diff --git a/mpg123_artsplugin/mpg123PlayObject_impl.h b/mpg123_artsplugin/mpg123PlayObject_impl.h
new file mode 100644
index 00000000..e8be2619
--- /dev/null
+++ b/mpg123_artsplugin/mpg123PlayObject_impl.h
@@ -0,0 +1,111 @@
+#ifndef MPG123PLAYER_IMPL_H
+#define MPG123PLAYER_IMPL_H "$Id$"
+
+using namespace std;
+
+#if (defined(__GNU_LIBRARY__) && defined(_SEM_SEMUN_UNDEFINED)) || defined(__osf__) || defined(__sun__)
+/* union semun is defined by including <sys/sem.h> */
+/* according to X/OPEN we have to define it ourselves */
+union semun {
+ int val; /* value for SETVAL */
+ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
+ unsigned short int *array; /* array for GETALL, SETALL */
+ struct seminfo *__buf; /* buffer for IPC_INFO */
+};
+#endif
+
+#define RESYNC_FRAMES 3
+
+extern "C" {
+ #include "mpg123/mpg123.h"
+ #include "dxhead.h"
+
+ // These are provided to make mpg123 happy
+ int audio_get_formats(struct audio_info_struct *ai);
+ char *equalfile;
+ struct parameter param;
+ char *prgName;
+ char *prgVersion;
+ struct audio_info_struct ai;
+
+ // We abuse these internal mpg123 objects
+ extern double compute_bpf(struct frame *fr);
+ extern double compute_tpf(struct frame *fr);
+ extern void set_pointer(int, long);
+ extern void audio_capabilities(struct audio_info_struct *);
+ extern unsigned char *pcm_sample;
+ extern int pcm_point;
+ extern int audiobufsize;
+}
+
+#define BACKBUFSIZ 8132
+
+struct id3tag {
+ char tag[3];
+ char title[30];
+ char artist[30];
+ char album[30];
+ char year[4];
+ char comment[30];
+ unsigned char genre;
+};
+
+namespace Arts {
+
+class mpg123PlayObject_impl
+ : public mpg123PlayObject_skel, public StdSynthModule
+{
+ public:
+ mpg123PlayObject_impl();
+ ~mpg123PlayObject_impl();
+ bool loadMedia(const string &filename);
+ string description();
+ poTime currentTime();
+ poTime overallTime();
+ poCapabilities capabilities();
+ string mediaName();
+ poState state();
+ void play();
+ void halt();
+ void seek(const class poTime &t);
+ void pause();
+ void streamInit();
+ void streamStart();
+ void calculateBlock(unsigned long samples);
+ void streamEnd();
+
+ protected:
+ // These are to enable seeking
+ static void stream_jump_to_frame(struct frame *fr, int frame);
+ static int calc_numframes(struct frame *);
+
+ // This is to enable playing, what else?
+ static void set_synth_functions(struct frame *fr);
+ void initialise_decoder();
+ int play_frame(int init);
+
+ inline float conv_16le_float(short x)
+ { return static_cast<float>(x) / 32768.0; }
+
+ int streaming, /*padded, cnt, junk_size, */ sample_freq /*frame_size*/;
+ char mpeg_name[FILENAME_MAX+1];
+ struct mpstr *mp;
+ static int decoder_init;
+
+ int buf_pos; // loops around the circular buffer
+ poState mState;
+ struct buf_t{
+ float left[BACKBUFSIZ];
+ float right[BACKBUFSIZ];
+ unsigned long len; // total frames
+ unsigned long pos; // last decoded frame
+ double tpf; // time per frame, seconds
+ } *shm_buf;
+ int shm_id, child_pid;
+ int buflen_sem;
+ unsigned char *pcm_buf;
+};
+
+};
+
+#endif