summaryrefslogtreecommitdiff
path: root/src/xine-engine/xine_interface.c
diff options
context:
space:
mode:
authorMichael Roitzsch <mroi@users.sourceforge.net>2004-02-12 18:19:00 +0000
committerMichael Roitzsch <mroi@users.sourceforge.net>2004-02-12 18:19:00 +0000
commitca2ac6410b4f348e0aaba232eb089d78bc0fbdfa (patch)
treec2fa6089615fa64fe11544843c8f94915c512fc6 /src/xine-engine/xine_interface.c
parentc2637f6fbd4a06ff0c433eccb705f52b35d46043 (diff)
downloadxine-lib-ca2ac6410b4f348e0aaba232eb089d78bc0fbdfa.tar.gz
xine-lib-ca2ac6410b4f348e0aaba232eb089d78bc0fbdfa.tar.bz2
big commit of the new ticket system to protect the rewiring and more
(as discussed on xine-devel, slightly improved to block acquires from different threads between atomic revoke and issue) * xine_ticket_t is declared in xine_internal.h and implemented in xine.c * the ticket is acquired for (hopefully) all port operations (no modifications to decoders needed, decoder loop does this) * the ticket is revoked on pausing and on rewiring * OSD does not store the port pointer any more (which was very dangerous, since the pointer can change on rewire) CVS patchset: 6137 CVS date: 2004/02/12 18:19:00
Diffstat (limited to 'src/xine-engine/xine_interface.c')
-rw-r--r--src/xine-engine/xine_interface.c116
1 files changed, 85 insertions, 31 deletions
diff --git a/src/xine-engine/xine_interface.c b/src/xine-engine/xine_interface.c
index fff706bd2..e1a8abcb0 100644
--- a/src/xine-engine/xine_interface.c
+++ b/src/xine-engine/xine_interface.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_interface.c,v 1.77 2004/01/23 09:26:16 andruil Exp $
+ * $Id: xine_interface.c,v 1.78 2004/02/12 18:19:12 mroi Exp $
*
* convenience/abstraction layer, functions to implement
* libxine's public interface
@@ -361,33 +361,45 @@ void xine_set_param (xine_stream_t *stream, int param, int value) {
break;
case XINE_PARAM_AUDIO_VOLUME:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (stream->audio_out)
stream->audio_out->set_property (stream->audio_out, AO_PROP_MIXER_VOL, value);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
break;
case XINE_PARAM_AUDIO_MUTE:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (stream->audio_out)
stream->audio_out->set_property (stream->audio_out, AO_PROP_MUTE_VOL, value);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
break;
case XINE_PARAM_AUDIO_COMPR_LEVEL:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (stream->audio_out)
stream->audio_out->set_property (stream->audio_out, AO_PROP_COMPRESSOR, value);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
break;
case XINE_PARAM_AUDIO_AMP_LEVEL:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (stream->audio_out)
stream->audio_out->set_property (stream->audio_out, AO_PROP_AMP, value);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
break;
case XINE_PARAM_AUDIO_AMP_MUTE:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (stream->audio_out)
stream->audio_out->set_property (stream->audio_out, AO_PROP_AMP_MUTE, value);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
break;
case XINE_PARAM_AUDIO_CLOSE_DEVICE:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (stream->audio_out)
stream->audio_out->set_property (stream->audio_out, AO_PROP_CLOSE_DEVICE, value);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
break;
case XINE_PARAM_EQ_30HZ:
@@ -400,10 +412,12 @@ void xine_set_param (xine_stream_t *stream, int param, int value) {
case XINE_PARAM_EQ_4000HZ:
case XINE_PARAM_EQ_8000HZ:
case XINE_PARAM_EQ_16000HZ:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (stream->audio_out)
stream->audio_out->set_property (stream->audio_out,
param - XINE_PARAM_EQ_30HZ + AO_PROP_EQ_30HZ,
value);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
break;
case XINE_PARAM_VERBOSITY:
@@ -419,7 +433,9 @@ void xine_set_param (xine_stream_t *stream, int param, int value) {
case XINE_PARAM_VO_ZOOM_Y:
case XINE_PARAM_VO_PAN_SCAN:
case XINE_PARAM_VO_TVMODE:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
stream->video_out->set_property(stream->video_out, param, value);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
break;
case XINE_PARAM_IGNORE_VIDEO:
@@ -449,54 +465,81 @@ void xine_set_param (xine_stream_t *stream, int param, int value) {
default:
xprintf (stream->xine, XINE_VERBOSITY_DEBUG, "xine_interface: unknown param %d\n", param);
- }
+ }
}
int xine_get_param (xine_stream_t *stream, int param) {
+ int ret;
switch (param) {
case XINE_PARAM_SPEED:
- return stream->xine->clock->speed;
+ ret = stream->xine->clock->speed;
+ break;
case XINE_PARAM_AV_OFFSET:
- return stream->metronom->get_option (stream->metronom, METRONOM_AV_OFFSET);
+ ret = stream->metronom->get_option (stream->metronom, METRONOM_AV_OFFSET);
+ break;
case XINE_PARAM_SPU_OFFSET:
- return stream->metronom->get_option (stream->metronom, METRONOM_SPU_OFFSET);
+ ret = stream->metronom->get_option (stream->metronom, METRONOM_SPU_OFFSET);
+ break;
case XINE_PARAM_AUDIO_CHANNEL_LOGICAL:
- return stream->audio_channel_user;
+ ret = stream->audio_channel_user;
+ break;
case XINE_PARAM_SPU_CHANNEL:
- return stream->spu_channel_user;
+ ret = stream->spu_channel_user;
+ break;
case XINE_PARAM_VIDEO_CHANNEL:
- return stream->video_channel;
+ ret = stream->video_channel;
+ break;
case XINE_PARAM_AUDIO_VOLUME:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (!stream->audio_out)
- return -1;
- return stream->audio_out->get_property (stream->audio_out, AO_PROP_MIXER_VOL);
+ ret = -1;
+ else
+ ret = stream->audio_out->get_property (stream->audio_out, AO_PROP_MIXER_VOL);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
+ break;
case XINE_PARAM_AUDIO_MUTE:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (!stream->audio_out)
- return -1;
- return stream->audio_out->get_property (stream->audio_out, AO_PROP_MUTE_VOL);
+ ret = -1;
+ else
+ ret = stream->audio_out->get_property (stream->audio_out, AO_PROP_MUTE_VOL);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
+ break;
case XINE_PARAM_AUDIO_COMPR_LEVEL:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (!stream->audio_out)
- return -1;
- return stream->audio_out->get_property (stream->audio_out, AO_PROP_COMPRESSOR);
+ ret = -1;
+ else
+ ret = stream->audio_out->get_property (stream->audio_out, AO_PROP_COMPRESSOR);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
+ break;
case XINE_PARAM_AUDIO_AMP_LEVEL:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (!stream->audio_out)
- return -1;
- return stream->audio_out->get_property (stream->audio_out, AO_PROP_AMP);
+ ret = -1;
+ else
+ ret = stream->audio_out->get_property (stream->audio_out, AO_PROP_AMP);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
+ break;
case XINE_PARAM_AUDIO_AMP_MUTE:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (!stream->audio_out)
- return -1;
- return stream->audio_out->get_property (stream->audio_out, AO_PROP_AMP_MUTE);
+ ret = -1;
+ else
+ ret = stream->audio_out->get_property (stream->audio_out, AO_PROP_AMP_MUTE);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
+ break;
case XINE_PARAM_EQ_30HZ:
case XINE_PARAM_EQ_60HZ:
@@ -508,15 +551,18 @@ int xine_get_param (xine_stream_t *stream, int param) {
case XINE_PARAM_EQ_4000HZ:
case XINE_PARAM_EQ_8000HZ:
case XINE_PARAM_EQ_16000HZ:
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
if (!stream->audio_out)
- return -1;
-
- return stream->audio_out->get_property (stream->audio_out,
- param - XINE_PARAM_EQ_30HZ + AO_PROP_EQ_30HZ);
+ ret = -1;
+ else
+ ret= stream->audio_out->get_property (stream->audio_out,
+ param - XINE_PARAM_EQ_30HZ + AO_PROP_EQ_30HZ);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
break;
case XINE_PARAM_VERBOSITY:
- return stream->xine->verbosity;
+ ret = stream->xine->verbosity;
+ break;
case XINE_PARAM_VO_HUE:
case XINE_PARAM_VO_SATURATION:
@@ -528,32 +574,40 @@ int xine_get_param (xine_stream_t *stream, int param) {
case XINE_PARAM_VO_ZOOM_Y:
case XINE_PARAM_VO_PAN_SCAN:
case XINE_PARAM_VO_TVMODE:
- return stream->video_out->get_property(stream->video_out, param);
+ stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
+ ret = stream->video_out->get_property(stream->video_out, param);
+ stream->xine->port_ticket->release(stream->xine->port_ticket, 0);
+ break;
case XINE_PARAM_IGNORE_VIDEO:
- return _x_stream_info_get_public(stream, XINE_STREAM_INFO_IGNORE_VIDEO);
+ ret = _x_stream_info_get_public(stream, XINE_STREAM_INFO_IGNORE_VIDEO);
+ break;
case XINE_PARAM_IGNORE_AUDIO:
- return _x_stream_info_get_public(stream, XINE_STREAM_INFO_IGNORE_AUDIO);
+ ret = _x_stream_info_get_public(stream, XINE_STREAM_INFO_IGNORE_AUDIO);
+ break;
case XINE_PARAM_IGNORE_SPU:
- return _x_stream_info_get_public(stream, XINE_STREAM_INFO_IGNORE_SPU);
+ ret = _x_stream_info_get_public(stream, XINE_STREAM_INFO_IGNORE_SPU);
+ break;
case XINE_PARAM_METRONOM_PREBUFFER:
- return stream->metronom->get_option(stream->metronom, METRONOM_PREBUFFER);
+ ret = stream->metronom->get_option(stream->metronom, METRONOM_PREBUFFER);
+ break;
case XINE_PARAM_BROADCASTER_PORT:
if( stream->broadcaster )
- return _x_get_broadcaster_port(stream->broadcaster);
+ ret = _x_get_broadcaster_port(stream->broadcaster);
else
- return 0;
+ ret = 0;
break;
default:
xprintf (stream->xine, XINE_VERBOSITY_DEBUG, "xine_interface: unknown param %d\n", param);
+ ret = 0;
}
- return 0;
+ return ret;
}
uint32_t xine_get_stream_info (xine_stream_t *stream, int info) {