X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fmediacontrol_audio_video.c;h=5356747806e370050c813a7dd7ab431138258ae0;hb=7db94f4d2fc742537828fbe0c8eb5a6612601749;hp=7b175317139bbaaf23483adde1eed5b17c7616c3;hpb=470b47fe952dbba82beca44cafefd4b6ec711384;p=vlc diff --git a/src/control/mediacontrol_audio_video.c b/src/control/mediacontrol_audio_video.c index 7b17531713..5356747806 100644 --- a/src/control/mediacontrol_audio_video.c +++ b/src/control/mediacontrol_audio_video.c @@ -21,149 +21,103 @@ * 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 "media_player_internal.h" #include +#include -#include -#include -#include -#include - +#include +#include #include - -#include +#include #include /* malloc(), free() */ #include -#include /* ENOMEM */ #include -#include #ifdef HAVE_UNISTD_H # include #endif -#ifdef HAVE_SYS_TIME_H -# include -#endif -#ifdef HAVE_SYS_TYPES_H -# include -#endif - -#define RAISE( c, m ) exception->code = c; \ - exception->message = strdup(m); +#include mediacontrol_RGBPicture * mediacontrol_snapshot( mediacontrol_Instance *self, const mediacontrol_Position * a_position, mediacontrol_Exception *exception ) { - vlc_object_t* p_cache; + (void)a_position; vout_thread_t* p_vout; - mediacontrol_RGBPicture *p_pic = NULL; - char path[256]; - snapshot_t *p_snapshot; + input_thread_t *p_input; + mediacontrol_RGBPicture *p_pic; + libvlc_exception_t ex; + + libvlc_exception_init( &ex ); + mediacontrol_exception_init( exception ); - exception=mediacontrol_exception_init( exception ); + 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( self->p_playlist, VLC_OBJECT_VOUT, FIND_CHILD ); + p_vout = input_GetVout( p_input ); + vlc_object_release( p_input ); 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 ); - if( p_cache == NULL ) + + block_t *p_image; + video_format_t fmt; + + if( vout_GetSnapshot( p_vout, &p_image, NULL, &fmt, "png", 500*1000 ) ) { vlc_object_release( p_vout ); - msg_Err( self->p_playlist, "out of memory" ); - RAISE( mediacontrol_InternalException, "Out of memory" ); + RAISE_NULL( mediacontrol_InternalException, "Snapshot exception" ); return NULL; } - snprintf( path, 255, "object:%d", p_cache->i_object_id ); - var_SetString( p_vout, "snapshot-path", path ); - var_SetString( p_vout, "snapshot-format", "png" ); - vlc_mutex_lock( &p_cache->object_lock ); - vout_Control( p_vout, VOUT_SNAPSHOT ); - vlc_cond_wait( &p_cache->object_wait, &p_cache->object_lock ); - vlc_object_release( p_vout ); - - p_snapshot = ( snapshot_t* ) p_cache->p_private; - vlc_object_destroy( p_cache ); - - if( p_snapshot ) + /* */ + char *p_data = malloc( p_image->i_buffer ); + if( p_data ) { - 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 ); - if( !p_pic ) - RAISE( mediacontrol_InternalException, "Out of memory" ); - free( p_snapshot->p_data ); - free( p_snapshot ); + memcpy( p_data, p_image->p_buffer, p_image->i_buffer ); + p_pic = private_mediacontrol_createRGBPicture( fmt.i_width, + fmt.i_height, + fmt.i_chroma, + p_image->i_pts, + p_data, + p_image->i_buffer ); } else { - RAISE( mediacontrol_InternalException, "Snapshot exception" ); + p_pic = NULL; } - return p_pic; -} + block_Release( p_image ); -mediacontrol_RGBPicture ** -mediacontrol_all_snapshots( mediacontrol_Instance *self, - mediacontrol_Exception *exception ) -{ - exception=mediacontrol_exception_init( exception ); + if( !p_pic ) + RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); - RAISE( mediacontrol_InternalException, "Unsupported method" ); - return NULL; + vlc_object_release( p_vout ); + return p_pic; } +static int mediacontrol_showtext( vout_thread_t *p_vout, int i_channel, - char *psz_string, text_style_t *p_style, + const 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( vout_GetSpu( p_vout ), i_channel, + psz_string, p_style, + i_flags, i_hmargin, i_vmargin, + i_start, i_stop ); } @@ -174,22 +128,30 @@ 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; + + libvlc_exception_init( &ex ); + mediacontrol_exception_init( exception ); + + if( !message ) + { + RAISE_VOID( mediacontrol_InternalException, "Empty text" ); + } - psz_message = strdup( message ); - if( !psz_message ) + 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 = input_GetVout( p_input ); + /*FIXME: take care of the next fixme that can use p_input */ + vlc_object_release( p_input ); - p_vout = vlc_object_find( self->p_playlist, VLC_OBJECT_VOUT, FIND_CHILD ); if( ! p_vout ) { - RAISE( mediacontrol_InternalException, "No video output" ); - return; + RAISE_VOID( mediacontrol_InternalException, "No video output" ); } if( begin->origin == mediacontrol_RelativePosition && @@ -199,13 +161,13 @@ 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, + mediacontrol_showtext( p_vout, DEFAULT_CHAN, message, NULL, OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 0, 0, i_now, i_now + i_duration ); } @@ -213,27 +175,19 @@ 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; - vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, psz_message, NULL, + vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, message, NULL, OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 0, 0, i_debut, i_fin ); } @@ -245,17 +199,13 @@ unsigned short mediacontrol_sound_get_volume( mediacontrol_Instance *self, mediacontrol_Exception *exception ) { - short retval; - audio_volume_t i_volume; + 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 ); + + i_ret = libvlc_audio_get_volume( self->p_instance ); + /* FIXME: Normalize in [0..100] */ + return (unsigned short)i_ret; } void @@ -263,27 +213,85 @@ 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; + mediacontrol_exception_init( exception ); +#ifdef WIN32 + libvlc_media_player_set_hwnd( self->p_media_player, visual_id ); +#else + libvlc_media_player_set_xwindow( self->p_media_player, visual_id ); +#endif + return true; +} - 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); +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 ); }