summaryrefslogtreecommitdiff
path: root/src/xine-engine/xine.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xine-engine/xine.c')
-rw-r--r--src/xine-engine/xine.c57
1 files changed, 31 insertions, 26 deletions
diff --git a/src/xine-engine/xine.c b/src/xine-engine/xine.c
index 691700e91..2e0a2f527 100644
--- a/src/xine-engine/xine.c
+++ b/src/xine-engine/xine.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine.c,v 1.106 2002/03/11 12:31:26 guenter Exp $
+ * $Id: xine.c,v 1.107 2002/03/11 19:58:01 jkeil Exp $
*
* top-level xine functions
*
@@ -144,6 +144,27 @@ static void update_osd_display(void *this_gen, cfg_entry_t *entry)
this->osd_display = entry->num_value;
}
+
+static void xine_set_speed_internal (xine_t *this, int speed) {
+
+ this->metronom->set_speed (this->metronom, speed);
+
+ /* see coment on audio_out loop about audio_paused */
+ if( this->audio_out ) {
+ this->audio_out->audio_paused = (speed != SPEED_NORMAL) +
+ (speed == SPEED_PAUSE);
+
+ if (speed != SPEED_NORMAL && speed != SPEED_PAUSE)
+ this->audio_out->control(this->audio_out, AO_CTRL_FLUSH_BUFFERS);
+
+ this->audio_out->control(this->audio_out,
+ speed == SPEED_PAUSE ? AO_CTRL_PLAY_PAUSE : AO_CTRL_PLAY_RESUME);
+ }
+
+ this->speed = speed;
+}
+
+
void xine_stop_internal (xine_t *this) {
pthread_mutex_lock (&this->xine_lock);
@@ -158,12 +179,10 @@ void xine_stop_internal (xine_t *this) {
return;
}
+ if (this->audio_out)
+ this->audio_out->control(this->audio_out, AO_CTRL_FLUSH_BUFFERS);
- this->metronom->set_speed (this->metronom, SPEED_NORMAL);
- this->speed = SPEED_NORMAL;
-
- if( this->audio_out )
- this->audio_out->audio_paused = 0;
+ xine_set_speed_internal(this, SPEED_NORMAL);
this->status = XINE_STOP;
LOG_MSG(this, _("xine_stop: stopping demuxer\n"));
@@ -300,6 +319,9 @@ int xine_play (xine_t *this, char *mrl,
this->cur_input_plugin->stop(this->cur_input_plugin);
}
+ if (this->audio_out)
+ this->audio_out->control(this->audio_out, AO_CTRL_FLUSH_BUFFERS);
+
this->status = XINE_STOP;
}
@@ -378,11 +400,7 @@ int xine_play (xine_t *this, char *mrl,
this->status = XINE_PLAY;
strncpy (this->cur_mrl, mrl, 1024);
- this->metronom->set_speed (this->metronom, SPEED_NORMAL);
-
- if( this->audio_out )
- this->audio_out->audio_paused = 0;
- this->speed = SPEED_NORMAL;
+ xine_set_speed_internal (this, SPEED_NORMAL);
/* osd */
xine_internal_osd (this, ">", 0, 300000);
@@ -679,8 +697,6 @@ int xine_get_av_offset (xine_t *this) {
void xine_set_speed (xine_t *this, int speed) {
- struct timespec tenth_sec;
-
pthread_mutex_lock (&this->xine_lock);
if (speed <= SPEED_PAUSE)
@@ -712,21 +728,10 @@ void xine_set_speed (xine_t *this, int speed) {
}
/* make sure osd can be displayed */
- tenth_sec.tv_sec = 0;
- tenth_sec.tv_nsec = 100000000;
-
- nanosleep (&tenth_sec, NULL);
+ xine_usec_sleep(100000);
LOG_MSG(this, _("xine: set_speed %d\n"), speed);
-
- this->metronom->set_speed (this->metronom, speed);
-
- /* see coment on audio_out loop about audio_paused */
- if( this->audio_out )
- this->audio_out->audio_paused = (speed != SPEED_NORMAL) +
- (speed == SPEED_PAUSE);
-
- this->speed = speed;
+ xine_set_speed_internal (this, speed);
pthread_mutex_unlock (&this->xine_lock);
}