You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/mpg123_artsplugin/mpg123PlayObject_impl.h

112 lines
2.7 KiB

#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