From: Miguel F. <mig...@us...> - 2002-12-26 21:53:45
|
Update of /cvsroot/xine/xine-lib/src/xine-engine In directory sc8-pr-cvs1:/tmp/cvs-serv29109/xine-engine Modified Files: audio_decoder.c audio_out.c audio_out.h post.c video_decoder.c video_out.h xine.c Log Message: - cleanup internal interfaces for rewiring - fix UI_PLAYBACK_FINISHED rifle Index: audio_decoder.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/audio_decoder.c,v retrieving revision 1.94 retrieving revision 1.95 diff -u -r1.94 -r1.95 --- audio_decoder.c 21 Dec 2002 16:13:43 -0000 1.94 +++ audio_decoder.c 26 Dec 2002 21:53:42 -0000 1.95 @@ -114,20 +114,11 @@ pthread_cond_broadcast (&stream->counter_changed); - if (stream->stream_info[XINE_STREAM_INFO_HAS_AUDIO]) { - - while (stream->finished_count_video < stream->finished_count_audio) { - pthread_cond_wait (&stream->counter_changed, &stream->counter_lock); - } + while (stream->finished_count_video < stream->finished_count_audio) { + pthread_cond_wait (&stream->counter_changed, &stream->counter_lock); } pthread_mutex_unlock (&stream->counter_lock); - - if (!stream->stream_info[XINE_STREAM_INFO_HAS_VIDEO]) { - /* set engine status, send frontend notification event */ - xine_handle_stream_end (stream, - buf->decoder_flags & BUF_FLAG_END_STREAM); - } stream->audio_channel_auto = -1; Index: audio_out.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/audio_out.c,v retrieving revision 1.93 retrieving revision 1.94 diff -u -r1.93 -r1.94 --- audio_out.c 24 Dec 2002 14:00:55 -0000 1.93 +++ audio_out.c 26 Dec 2002 21:53:42 -0000 1.94 @@ -106,6 +106,50 @@ #define SYNC_BUF_INTERVAL NUM_AUDIO_BUFFERS / 2 #define SYNC_GAP_RATE 4 + +typedef struct { + + xine_audio_port_t ao; /* public part */ + + /* private stuff */ + ao_driver_t *driver; + pthread_mutex_t driver_lock; + metronom_clock_t *clock; + xine_t *xine; + xine_list_t *streams; + pthread_mutex_t streams_lock; + + int audio_loop_running; + int audio_paused; + pthread_t audio_thread; + + int audio_step; /* pts per 32 768 samples (sample = #bytes/2) */ + int32_t frames_per_kpts; /* frames per 1024/90000 sec */ + + ao_format_t input, output; /* format conversion done at audio_out.c */ + double frame_rate_factor; + + int resample_conf; + int force_rate; /* force audio output rate to this value if non-zero */ + int do_resample; + int gap_tolerance; + audio_fifo_t *free_fifo; + audio_fifo_t *out_fifo; + int64_t last_audio_vpts; + + audio_buffer_t *frame_buf[2]; /* two buffers for "stackable" conversions */ + int16_t *zero_space; + + int64_t passthrough_offset; + int flush_audio_driver; + int discard_buffers; + + int do_compress; + double compression_factor; /* current compression */ + double compression_factor_max; /* user limit on compression */ + +} aos_t; + struct audio_fifo_s { audio_buffer_t *first; audio_buffer_t *last; @@ -206,8 +250,8 @@ } -static void write_pause_burst(xine_audio_port_t *this, uint32_t num_frames) { - +static void write_pause_burst(aos_t *this, uint32_t num_frames) { + int error = 0; unsigned char buf[8192]; unsigned short *sbuf = (unsigned short *)&buf[0]; @@ -244,7 +288,7 @@ } -static void ao_fill_gap (xine_audio_port_t *this, int64_t pts_len) { +static void ao_fill_gap (aos_t *this, int64_t pts_len) { int num_frames ; @@ -285,7 +329,7 @@ buf->num_frames = frames; } -static audio_buffer_t * swap_frame_buffers ( xine_audio_port_t *this ) { +static audio_buffer_t * swap_frame_buffers ( aos_t *this ) { audio_buffer_t *tmp; tmp = this->frame_buf[1]; @@ -310,7 +354,7 @@ return 0; } -static void audio_filter_compress (xine_audio_port_t *this, int16_t *mem, int num_frames) { +static void audio_filter_compress (aos_t *this, int16_t *mem, int num_frames) { int i, maxs; double f_max; @@ -358,7 +402,7 @@ } } -static audio_buffer_t* prepare_samples( xine_audio_port_t *this, audio_buffer_t *buf) { +static audio_buffer_t* prepare_samples( aos_t *this, audio_buffer_t *buf) { double acc_output_frames, output_frame_excess = 0; int num_output_frames ; @@ -492,7 +536,7 @@ */ static void *ao_loop (void *this_gen) { - xine_audio_port_t *this = (xine_audio_port_t *) this_gen; + aos_t *this = (aos_t *) this_gen; int64_t hw_vpts; audio_buffer_t *in_buf, *out_buf; int64_t gap; @@ -532,7 +576,7 @@ } if (this->flush_audio_driver) { - this->control(this, AO_CTRL_FLUSH_BUFFERS); + this->ao.control(&this->ao, AO_CTRL_FLUSH_BUFFERS); this->flush_audio_driver = 0; continue; } @@ -701,9 +745,10 @@ * open the audio device for writing to, start audio output thread */ -static int ao_open(xine_audio_port_t *this, xine_stream_t *stream, +static int ao_open(xine_audio_port_t *this_gen, xine_stream_t *stream, uint32_t bits, uint32_t rate, int mode) { + aos_t *this = (aos_t *) this_gen; int output_sample_rate, err; pthread_attr_t pth_attrs; @@ -837,7 +882,9 @@ return this->output.rate; } -static audio_buffer_t *ao_get_buffer (xine_audio_port_t *this) { +static audio_buffer_t *ao_get_buffer (xine_audio_port_t *this_gen) { + + aos_t *this = (aos_t *) this_gen; audio_buffer_t *buf; buf = fifo_remove (this->free_fifo); @@ -846,8 +893,10 @@ return buf; } -static void ao_put_buffer (xine_audio_port_t *this, audio_buffer_t *buf, xine_stream_t *stream) { +static void ao_put_buffer (xine_audio_port_t *this_gen, + audio_buffer_t *buf, xine_stream_t *stream) { + aos_t *this = (aos_t *) this_gen; int64_t pts; if (buf->num_frames == 0) { @@ -876,8 +925,9 @@ #endif } -static void ao_close(xine_audio_port_t *this, xine_stream_t *stream) { +static void ao_close(xine_audio_port_t *this_gen, xine_stream_t *stream) { + aos_t *this = (aos_t *) this_gen; audio_buffer_t *audio_buffer; xine_stream_t *cur; @@ -910,7 +960,8 @@ pthread_mutex_unlock( &this->driver_lock ); } -static void ao_exit(xine_audio_port_t *this) { +static void ao_exit(xine_audio_port_t *this_gen) { + aos_t *this = (aos_t *) this_gen; int vol; int prop = 0; @@ -971,7 +1022,8 @@ free (this); } -static uint32_t ao_get_capabilities (xine_audio_port_t *this) { +static uint32_t ao_get_capabilities (xine_audio_port_t *this_gen) { + aos_t *this = (aos_t *) this_gen; uint32_t result; pthread_mutex_lock( &this->driver_lock ); @@ -981,7 +1033,8 @@ return result; } -static int ao_get_property (xine_audio_port_t *this, int property) { +static int ao_get_property (xine_audio_port_t *this_gen, int property) { + aos_t *this = (aos_t *) this_gen; int ret; switch (property) { @@ -993,6 +1046,10 @@ ret = this->discard_buffers; break; + case AO_PROP_PAUSED: + ret = this->audio_paused; + break; + default: pthread_mutex_lock( &this->driver_lock ); ret = this->driver->get_property(this->driver, property); @@ -1001,7 +1058,8 @@ return ret; } -static int ao_set_property (xine_audio_port_t *this, int property, int value) { +static int ao_set_property (xine_audio_port_t *this_gen, int property, int value) { + aos_t *this = (aos_t *) this_gen; int ret; switch (property) { @@ -1018,6 +1076,11 @@ ret = this->discard_buffers; break; + case AO_PROP_PAUSED: + this->audio_paused = value; + ret = this->audio_paused; + break; + default: pthread_mutex_lock( &this->driver_lock ); ret = this->driver->set_property(this->driver, property, value); @@ -1027,23 +1090,25 @@ return ret; } -static int ao_control (xine_audio_port_t *this, int cmd, ...) { +static int ao_control (xine_audio_port_t *this_gen, int cmd, ...) { + aos_t *this = (aos_t *) this_gen; va_list args; void *arg; int rval; + pthread_mutex_lock( &this->driver_lock ); va_start(args, cmd); arg = va_arg(args, void*); - pthread_mutex_lock( &this->driver_lock ); rval = this->driver->control(this->driver, cmd, arg); - pthread_mutex_unlock( &this->driver_lock ); va_end(args); + pthread_mutex_unlock( &this->driver_lock ); return rval; } -static void ao_flush (xine_audio_port_t *this) { +static void ao_flush (xine_audio_port_t *this_gen) { + aos_t *this = (aos_t *) this_gen; audio_buffer_t *buf; if( this->audio_loop_running ) { @@ -1064,11 +1129,11 @@ xine_audio_port_t *ao_new_port (xine_t *xine, ao_driver_t *driver) { config_values_t *config = xine->config; - xine_audio_port_t *this; + aos_t *this; int i; static char *resample_modes[] = {"auto", "off", "on", NULL}; - this = xine_xmalloc (sizeof (xine_audio_port_t)) ; + this = xine_xmalloc (sizeof (aos_t)) ; this->driver = driver; this->xine = xine; @@ -1078,16 +1143,17 @@ pthread_mutex_init( &this->streams_lock, NULL ); pthread_mutex_init( &this->driver_lock, NULL ); - this->open = ao_open; - this->get_buffer = ao_get_buffer; - this->put_buffer = ao_put_buffer; - this->close = ao_close; - this->exit = ao_exit; - this->get_capabilities = ao_get_capabilities; - this->get_property = ao_get_property; - this->set_property = ao_set_property; - this->control = ao_control; - this->flush = ao_flush; + this->ao.open = ao_open; + this->ao.get_buffer = ao_get_buffer; + this->ao.put_buffer = ao_put_buffer; + this->ao.close = ao_close; + this->ao.exit = ao_exit; + this->ao.get_capabilities = ao_get_capabilities; + this->ao.get_property = ao_get_property; + this->ao.set_property = ao_set_property; + this->ao.control = ao_control; + this->ao.flush = ao_flush; + this->audio_loop_running = 0; this->audio_paused = 0; this->flush_audio_driver = 0; @@ -1161,14 +1227,14 @@ 0, NULL, NULL)) { int prop = 0; - if((ao_get_capabilities(this)) & AO_CAP_MIXER_VOL) + if((ao_get_capabilities(&this->ao)) & AO_CAP_MIXER_VOL) prop = AO_PROP_MIXER_VOL; - else if((ao_get_capabilities(this)) & AO_CAP_PCM_VOL) + else if((ao_get_capabilities(&this->ao)) & AO_CAP_PCM_VOL) prop = AO_PROP_PCM_VOL; - ao_set_property(this, prop, vol); + ao_set_property(&this->ao, prop, vol); } } - return this; + return &this->ao; } Index: audio_out.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/audio_out.h,v retrieving revision 1.45 retrieving revision 1.46 diff -u -r1.45 -r1.46 --- audio_out.h 24 Dec 2002 14:00:57 -0000 1.45 +++ audio_out.h 26 Dec 2002 21:53:42 -0000 1.46 @@ -220,45 +220,6 @@ */ void (*flush) (xine_audio_port_t *this); - /* the driver in use */ - ao_driver_t *driver; - - /* private stuff */ - pthread_mutex_t driver_lock; - metronom_clock_t *clock; - xine_t *xine; - xine_list_t *streams; - pthread_mutex_t streams_lock; - - int audio_loop_running; - int audio_paused; - pthread_t audio_thread; - - int audio_step; /* pts per 32 768 samples (sample = #bytes/2) */ - int32_t frames_per_kpts; /* frames per 1024/90000 sec */ - - ao_format_t input, output; /* format conversion done at audio_out.c */ - double frame_rate_factor; - - int resample_conf; - int force_rate; /* force audio output rate to this value if non-zero */ - int do_resample; - int gap_tolerance; - audio_fifo_t *free_fifo; - audio_fifo_t *out_fifo; - int64_t last_audio_vpts; - - audio_buffer_t *frame_buf[2]; /* two buffers for "stackable" conversions */ - int16_t *zero_space; - - int64_t passthrough_offset; - int flush_audio_driver; - int discard_buffers; - - int do_compress; - double compression_factor; /* current compression */ - double compression_factor_max; /* user limit on compression */ - }; typedef struct audio_driver_class_s audio_driver_class_t; @@ -322,12 +283,12 @@ #define AO_PROP_MUTE_VOL 2 #define AO_PROP_COMPRESSOR 3 #define AO_PROP_DISCARD_BUFFERS 4 - +#define AO_PROP_PAUSED 5 /* audio device control ops */ #define AO_CTRL_PLAY_PAUSE 0 #define AO_CTRL_PLAY_RESUME 1 -#define AO_CTRL_FLUSH_BUFFERS 2 +#define AO_CTRL_FLUSH_BUFFERS 2 /* above that value audio frames are discarded */ #define AO_MAX_GAP 15000 Index: post.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/post.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- post.c 25 Dec 2002 15:03:20 -0000 1.4 +++ post.c 26 Dec 2002 21:53:42 -0000 1.5 @@ -246,8 +246,6 @@ post_port->port.set_property = post_audio_set_property; post_port->port.control = post_audio_control; post_port->port.flush = post_audio_flush; - post_port->port.driver = original->driver; - post_port->original_port = original; post_port->post = post; Index: video_decoder.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/video_decoder.c,v retrieving revision 1.116 retrieving revision 1.117 diff -u -r1.116 -r1.117 --- video_decoder.c 22 Dec 2002 15:02:06 -0000 1.116 +++ video_decoder.c 26 Dec 2002 21:53:42 -0000 1.117 @@ -143,8 +143,7 @@ pthread_cond_broadcast (&stream->counter_changed); - if (stream->stream_info[XINE_STREAM_INFO_HAS_VIDEO] - && stream->audio_fifo) { + if (stream->audio_fifo) { while (stream->finished_count_video > stream->finished_count_audio) { pthread_cond_wait (&stream->counter_changed, &stream->counter_lock); @@ -153,11 +152,8 @@ pthread_mutex_unlock (&stream->counter_lock); - if (stream->stream_info[XINE_STREAM_INFO_HAS_VIDEO]) { - /* set engine status, send frontend notification event */ - xine_handle_stream_end (stream, - buf->decoder_flags & BUF_FLAG_END_STREAM); - } + /* set engine status, send frontend notification event */ + xine_handle_stream_end (stream, buf->decoder_flags & BUF_FLAG_END_STREAM); /* Wake up xine_play if it's waiting for a frame */ pthread_mutex_lock (&stream->first_frame_lock); Index: video_out.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/video_out.h,v retrieving revision 1.74 retrieving revision 1.75 diff -u -r1.74 -r1.75 --- video_out.h 21 Dec 2002 12:56:52 -0000 1.74 +++ video_out.h 26 Dec 2002 21:53:42 -0000 1.75 @@ -175,8 +175,6 @@ /* the driver in use */ vo_driver_t *driver; - /* private stuff can be added here */ - }; /* constants for the get/set property functions */ Index: xine.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/xine.c,v retrieving revision 1.202 retrieving revision 1.203 diff -u -r1.202 -r1.203 --- xine.c 22 Dec 2002 23:30:29 -0000 1.202 +++ xine.c 26 Dec 2002 21:53:42 -0000 1.203 @@ -126,8 +126,8 @@ /* see coment on audio_out loop about audio_paused */ if( stream->audio_out ) { - stream->audio_out->audio_paused = (speed != XINE_SPEED_NORMAL) + - (speed == XINE_SPEED_PAUSE); + stream->audio_out->set_property( stream->audio_out, AO_PROP_PAUSED, + (speed != XINE_SPEED_NORMAL) + (speed == XINE_SPEED_PAUSE) ); /* * slow motion / fast forward does not play sound, drop buffered |