X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcontrol%2Fmediacontrol_audio_video.c;h=cf6f0268c96e3708e587f21aa5c98da3960556aa;hb=6a0b7bb7097e0851f38cc9f6c2b2062c0fd14e8c;hp=770ede125beef9d5843aaffd0ff1f1f055c895d4;hpb=8ab353b1123d829cd0e335a36cc7dffb4ae83a19;p=vlc diff --git a/src/control/mediacontrol_audio_video.c b/src/control/mediacontrol_audio_video.c index 770ede125b..cf6f0268c9 100644 --- a/src/control/mediacontrol_audio_video.c +++ b/src/control/mediacontrol_audio_video.c @@ -21,19 +21,18 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include "mediacontrol_internal.h" +#include "libvlc_internal.h" #include +#include -#include -#include -#include -#include - +#include #include -#include - #include /* malloc(), free() */ #include @@ -51,119 +50,87 @@ # include #endif -#define RAISE( c, m ) exception->code = c; \ - exception->message = strdup(m); - mediacontrol_RGBPicture * mediacontrol_snapshot( mediacontrol_Instance *self, const mediacontrol_Position * a_position, mediacontrol_Exception *exception ) { + (void)a_position; vlc_object_t* p_cache; vout_thread_t* p_vout; + input_thread_t *p_input; mediacontrol_RGBPicture *p_pic = NULL; char path[256]; snapshot_t *p_snapshot; + libvlc_exception_t ex; - exception=mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + mediacontrol_exception_init( exception ); - p_vout = vlc_object_find( self->p_playlist, VLC_OBJECT_VOUT, FIND_CHILD ); + p_input = libvlc_get_input_thread( self->p_media_player, &ex ); + if( ! p_input ) + { + RAISE_NULL( mediacontrol_InternalException, "No input" ); + } + p_vout = vlc_object_find( p_input, VLC_OBJECT_VOUT, FIND_CHILD ); if( ! p_vout ) { - RAISE( mediacontrol_InternalException, "No video output" ); - return NULL; + RAISE_NULL( mediacontrol_InternalException, "No video output" ); } - p_cache = vlc_object_create( self->p_playlist, VLC_OBJECT_GENERIC ); + p_cache = vlc_object_create( p_input, sizeof( vlc_object_t ) ); if( p_cache == NULL ) { vlc_object_release( p_vout ); - msg_Err( self->p_playlist, "out of memory" ); - RAISE( mediacontrol_InternalException, "Out of memory" ); - return NULL; + vlc_object_release( p_input ); + RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); } - snprintf( path, 255, "object:%d", p_cache->i_object_id ); + snprintf( path, 255, "object:%ju", (uintmax_t)(uintptr_t)p_cache ); var_SetString( p_vout, "snapshot-path", path ); var_SetString( p_vout, "snapshot-format", "png" ); - vlc_mutex_lock( &p_cache->object_lock ); + vlc_object_lock( p_cache ); vout_Control( p_vout, VOUT_SNAPSHOT ); - vlc_cond_wait( &p_cache->object_wait, &p_cache->object_lock ); + vlc_object_wait( p_cache ); vlc_object_release( p_vout ); p_snapshot = ( snapshot_t* ) p_cache->p_private; - vlc_object_destroy( p_cache ); + vlc_object_unlock( p_cache ); + vlc_object_release( p_cache ); + vlc_object_release( p_input ); if( p_snapshot ) { - p_pic = _mediacontrol_createRGBPicture( p_snapshot->i_width, - p_snapshot->i_height, - VLC_FOURCC( 'p','n','g',' ' ), - p_snapshot->date, - p_snapshot->p_data, - p_snapshot->i_datasize ); + /* Note: p_snapshot->p_data is directly used, not copied. Thus + do not free it here. */ + p_pic = private_mediacontrol_createRGBPicture( p_snapshot->i_width, + p_snapshot->i_height, + VLC_FOURCC( 'p','n','g',' ' ), + p_snapshot->date, + p_snapshot->p_data, + p_snapshot->i_datasize ); if( !p_pic ) - RAISE( mediacontrol_InternalException, "out of memory" ); - free( p_snapshot->p_data ); - free( p_snapshot ); + { + free( p_snapshot ); + RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); + } } else { - RAISE( mediacontrol_InternalException, "Snapshot exception" ); + RAISE_NULL( mediacontrol_InternalException, "Snapshot exception" ); } return p_pic; } -mediacontrol_RGBPicture ** -mediacontrol_all_snapshots( mediacontrol_Instance *self, - mediacontrol_Exception *exception ) -{ - exception=mediacontrol_exception_init( exception ); - - RAISE( mediacontrol_InternalException, "unsupported method" ); - return NULL; -} - +static int mediacontrol_showtext( vout_thread_t *p_vout, int i_channel, char *psz_string, text_style_t *p_style, int i_flags, int i_hmargin, int i_vmargin, mtime_t i_start, mtime_t i_stop ) { - subpicture_t *p_spu; - video_format_t fmt; - - if( !psz_string ) return VLC_EGENERIC; - - p_spu = spu_CreateSubpicture( p_vout->p_spu ); - if( !p_spu ) return VLC_EGENERIC; - - /* Create a new subpicture region */ - memset( &fmt, 0, sizeof(video_format_t) ); - fmt.i_chroma = VLC_FOURCC('T','E','X','T'); - fmt.i_aspect = 0; - fmt.i_width = fmt.i_height = 0; - fmt.i_x_offset = fmt.i_y_offset = 0; - p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_vout), &fmt ); - if( !p_spu->p_region ) - { - msg_Err( p_vout, "cannot allocate SPU region" ); - spu_DestroySubpicture( p_vout->p_spu, p_spu ); - return VLC_EGENERIC; - } - - p_spu->p_region->psz_text = strdup( psz_string ); - p_spu->i_start = i_start; - p_spu->i_stop = i_stop; - p_spu->b_ephemer = VLC_FALSE; - p_spu->b_absolute = VLC_FALSE; - - p_spu->i_x = i_hmargin; - p_spu->i_y = i_vmargin; - p_spu->i_flags = i_flags; - p_spu->i_channel = i_channel; - - spu_DisplaySubpicture( p_vout->p_spu, p_spu ); - - return VLC_SUCCESS; + return osd_ShowTextAbsolute( p_vout->p_spu, i_channel, + psz_string, p_style, + i_flags, i_hmargin, i_vmargin, + i_start, i_stop ); } @@ -174,22 +141,29 @@ mediacontrol_display_text( mediacontrol_Instance *self, const mediacontrol_Position * end, mediacontrol_Exception *exception ) { - input_thread_t *p_input = NULL; vout_thread_t *p_vout = NULL; char* psz_message; + input_thread_t *p_input; + libvlc_exception_t ex; - psz_message = strdup( message ); - if( !psz_message ) + libvlc_exception_init( &ex ); + mediacontrol_exception_init( exception ); + + p_input = libvlc_get_input_thread( self->p_media_player, &ex ); + if( ! p_input ) { - RAISE( mediacontrol_InternalException, "no more memory" ); - return; + RAISE_VOID( mediacontrol_InternalException, "No input" ); } - - p_vout = vlc_object_find( self->p_playlist, VLC_OBJECT_VOUT, FIND_CHILD ); + p_vout = vlc_object_find( p_input, VLC_OBJECT_VOUT, FIND_CHILD ); if( ! p_vout ) { - RAISE( mediacontrol_InternalException, "no video output" ); - return; + RAISE_VOID( mediacontrol_InternalException, "No video output" ); + } + + psz_message = strdup( message ); + if( !psz_message ) + { + RAISE_VOID( mediacontrol_InternalException, "no more memory" ); } if( begin->origin == mediacontrol_RelativePosition && @@ -199,11 +173,11 @@ mediacontrol_display_text( mediacontrol_Instance *self, mtime_t i_duration = 0; mtime_t i_now = mdate(); - i_duration = 1000 * mediacontrol_unit_convert( - self->p_playlist->p_input, - end->key, - mediacontrol_MediaTime, - end->value ); + i_duration = 1000 * private_mediacontrol_unit_convert( + self->p_media_player, + end->key, + mediacontrol_MediaTime, + end->value ); mediacontrol_showtext( p_vout, DEFAULT_CHAN, psz_message, NULL, OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 0, 0, @@ -213,23 +187,15 @@ mediacontrol_display_text( mediacontrol_Instance *self, { mtime_t i_debut, i_fin, i_now; - p_input = self->p_playlist->p_input; - if( ! p_input ) - { - RAISE( mediacontrol_InternalException, "No input" ); - vlc_object_release( p_vout ); - return; - } - /* FIXME */ /* i_now = input_ClockGetTS( p_input, NULL, 0 ); */ i_now = mdate(); - i_debut = mediacontrol_position2microsecond( p_input, + i_debut = private_mediacontrol_position2microsecond( self->p_media_player, ( mediacontrol_Position* ) begin ); i_debut += i_now; - i_fin = mediacontrol_position2microsecond( p_input, + i_fin = private_mediacontrol_position2microsecond( self->p_media_player, ( mediacontrol_Position * ) end ); i_fin += i_now; @@ -245,17 +211,16 @@ unsigned short mediacontrol_sound_get_volume( mediacontrol_Instance *self, mediacontrol_Exception *exception ) { - short retval; - audio_volume_t i_volume; + libvlc_exception_t ex; + int i_ret = 0; - if( !self->p_intf ) - { - RAISE( mediacontrol_InternalException, "No interface module" ); - return 0; - } - aout_VolumeGet( self->p_intf, &i_volume ); - retval = i_volume; - return retval; + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + + i_ret = libvlc_audio_get_volume( self->p_instance, &ex ); + HANDLE_LIBVLC_EXCEPTION_ZERO( &ex ); + /* FIXME: Normalize in [0..100] */ + return (unsigned short)i_ret; } void @@ -263,27 +228,86 @@ mediacontrol_sound_set_volume( mediacontrol_Instance *self, const unsigned short volume, mediacontrol_Exception *exception ) { - if( !self->p_intf ) - { - RAISE( mediacontrol_InternalException, "No interface module" ); - } - else aout_VolumeSet( self->p_intf,( audio_volume_t )volume ); + /* FIXME: Normalize in [0..100] */ + libvlc_exception_t ex; + + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + + libvlc_audio_set_volume( self->p_instance, volume, &ex ); + HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); } -vlc_bool_t mediacontrol_set_visual( mediacontrol_Instance *self, +int mediacontrol_set_visual( mediacontrol_Instance *self, WINDOWHANDLE visual_id, mediacontrol_Exception *exception ) { - vlc_value_t value; - int ret; + libvlc_exception_t ex; - if( !self->p_vlc ) - { - RAISE( mediacontrol_InternalException, "No vlc reference" ); - return VLC_FALSE; - } - value.i_int=visual_id; - ret = var_Set(self->p_vlc, "drawable", value); + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + + libvlc_media_player_set_drawable( self->p_media_player, (libvlc_drawable_t)visual_id, &ex ); + HANDLE_LIBVLC_EXCEPTION_ZERO( &ex ); + return true; +} + +int +mediacontrol_get_rate( mediacontrol_Instance *self, + mediacontrol_Exception *exception ) +{ + libvlc_exception_t ex; + int i_ret; + + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + + i_ret = libvlc_media_player_get_rate( self->p_media_player, &ex ); + HANDLE_LIBVLC_EXCEPTION_ZERO( &ex ); + + return i_ret / 10; +} + +void +mediacontrol_set_rate( mediacontrol_Instance *self, + const int rate, + mediacontrol_Exception *exception ) +{ + libvlc_exception_t ex; + + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + + libvlc_media_player_set_rate( self->p_media_player, rate * 10, &ex ); + HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); +} + +int +mediacontrol_get_fullscreen( mediacontrol_Instance *self, + mediacontrol_Exception *exception ) +{ + libvlc_exception_t ex; + int i_ret; + + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + + i_ret = libvlc_get_fullscreen( self->p_media_player, &ex ); + HANDLE_LIBVLC_EXCEPTION_ZERO( &ex ); + + return i_ret; +} + +void +mediacontrol_set_fullscreen( mediacontrol_Instance *self, + const int b_fullscreen, + mediacontrol_Exception *exception ) +{ + libvlc_exception_t ex; + + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); - return (ret == VLC_SUCCESS); + libvlc_set_fullscreen( self->p_media_player, b_fullscreen, &ex ); + HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); }