medialib: Allow playback preferences to be get/set as batches

This commit is contained in:
Hugo Beauzée-Luyssen 2019-07-30 15:21:40 +02:00
parent 9f6b3be3c7
commit f4c8acd04c
4 changed files with 151 additions and 1 deletions

View File

@ -455,6 +455,8 @@ enum vlc_ml_control
VLC_ML_MEDIA_INCREASE_PLAY_COUNT, /**< arg1: media id; can fail */
VLC_ML_MEDIA_GET_MEDIA_PLAYBACK_STATE, /**< arg1: media id; arg2: vlc_ml_playback_state; arg3: char**; */
VLC_ML_MEDIA_SET_MEDIA_PLAYBACK_STATE, /**< arg1: media id; arg2: vlc_ml_playback_state; arg3: const char*; */
VLC_ML_MEDIA_GET_ALL_MEDIA_PLAYBACK_STATES, /**< arg1: media id; arg2(out): vlc_ml_playback_states_all* */
VLC_ML_MEDIA_SET_ALL_MEDIA_PLAYBACK_STATES, /**< arg1: media id; arg2: const vlc_ml_playback_states_all* */
VLC_ML_MEDIA_SET_THUMBNAIL, /**< arg1: media id; arg2: const char*; arg3: vlc_ml_thumbnail_size_t */
VLC_ML_MEDIA_GENERATE_THUMBNAIL, /**< arg1: media id; arg2: vlc_ml_thumbnail_size_t; arg3: width; arg4: height; arg5: position */
VLC_ML_MEDIA_ADD_EXTERNAL_MRL, /**< arg1: media id; arg2: const char*; arg3: type(vlc_ml_file_type_t) */
@ -493,6 +495,21 @@ enum vlc_ml_playback_state
VLC_ML_PLAYBACK_STATE_APP_SPECIFIC,
};
typedef struct vlc_ml_playback_states_all
{
float progress;
float rate;
float zoom;
int current_title;
int current_video_track;
int current_audio_track;
int current_subtitle_track;
char* aspect_ratio;
char* crop;
char* deinterlace;
char* video_filter;
} vlc_ml_playback_states_all;
enum vlc_ml_event_type
{
/**
@ -789,6 +806,7 @@ VLC_API void vlc_ml_show_list_release( vlc_ml_show_list_t* p_list );
VLC_API void vlc_ml_genre_list_release( vlc_ml_genre_list_t* p_list );
VLC_API void vlc_ml_playlist_list_release( vlc_ml_playlist_list_t* p_list );
VLC_API void vlc_ml_entry_point_list_release( vlc_ml_entry_point_list_t* p_list );
VLC_API void vlc_ml_playback_states_all_release( vlc_ml_playback_states_all* prefs );
static inline vlc_ml_query_params_t vlc_ml_query_params_create()
{
@ -884,6 +902,20 @@ static inline int vlc_ml_media_set_playback_state( vlc_medialibrary_t* p_ml, int
return vlc_ml_control( p_ml, VLC_ML_MEDIA_SET_MEDIA_PLAYBACK_STATE, i_media_id, i_state, psz_value );
}
static inline int vlc_ml_media_get_all_playback_pref( vlc_medialibrary_t* p_ml,
int64_t i_media_id,
vlc_ml_playback_states_all* prefs )
{
return vlc_ml_control( p_ml,VLC_ML_MEDIA_GET_ALL_MEDIA_PLAYBACK_STATES, i_media_id, prefs );
}
static inline int vlc_ml_media_set_all_playback_states( vlc_medialibrary_t* p_ml,
int64_t i_media_id,
const vlc_ml_playback_states_all* prefs )
{
return vlc_ml_control( p_ml, VLC_ML_MEDIA_SET_ALL_MEDIA_PLAYBACK_STATES, i_media_id, prefs );
}
static inline int vlc_ml_media_set_thumbnail( vlc_medialibrary_t* p_ml, int64_t i_media_id,
const char* psz_mrl, vlc_ml_thumbnail_size_t sizeType )
{
@ -1357,7 +1389,8 @@ static inline size_t vlc_ml_count_playlist_media( vlc_medialibrary_t* p_ml, cons
vlc_ml_show_list_t*: vlc_ml_show_list_release, \
vlc_ml_genre_list_t*: vlc_ml_genre_list_release, \
vlc_ml_playlist_list_t*: vlc_ml_playlist_list_release, \
vlc_ml_entry_point_list_t*: vlc_ml_entry_point_list_release \
vlc_ml_entry_point_list_t*: vlc_ml_entry_point_list_release, \
vlc_ml_playback_states_all*: vlc_ml_playback_states_all_release \
)( OBJ )
#else
static inline void vlc_ml_release( vlc_ml_show_t* show ) { vlc_ml_show_release( show ); }
@ -1375,6 +1408,7 @@ static inline void vlc_ml_release( vlc_ml_show_list_t* list ) { vlc_ml_show_list
static inline void vlc_ml_release( vlc_ml_genre_list_t* list ) { vlc_ml_genre_list_release( list ); }
static inline void vlc_ml_release( vlc_ml_playlist_list_t* list ) { vlc_ml_playlist_list_release( list ); }
static inline void vlc_ml_release( vlc_ml_entry_point_list_t* list ) { vlc_ml_entry_point_list_release( list ); }
static inline void vlc_ml_release( vlc_ml_playback_states_all* prefs ) { vlc_ml_playback_states_all_release( prefs ); }
#endif
#endif /* VLC_MEDIA_LIBRARY_H */

View File

@ -518,6 +518,8 @@ int MediaLibrary::Control( int query, va_list args )
case VLC_ML_MEDIA_INCREASE_PLAY_COUNT:
case VLC_ML_MEDIA_GET_MEDIA_PLAYBACK_STATE:
case VLC_ML_MEDIA_SET_MEDIA_PLAYBACK_STATE:
case VLC_ML_MEDIA_GET_ALL_MEDIA_PLAYBACK_STATES:
case VLC_ML_MEDIA_SET_ALL_MEDIA_PLAYBACK_STATES:
case VLC_ML_MEDIA_SET_THUMBNAIL:
case VLC_ML_MEDIA_GENERATE_THUMBNAIL:
case VLC_ML_MEDIA_ADD_EXTERNAL_MRL:
@ -981,6 +983,67 @@ int MediaLibrary::getMeta( const medialibrary::IMedia& media, int meta, char** r
return VLC_SUCCESS;
}
int MediaLibrary::getMeta( const medialibrary::IMedia& media,
vlc_ml_playback_states_all* res )
{
auto metas = media.metadata();
res->progress = -1.f;
res->rate = .0f;
res->zoom = -1.f;
res->current_title = -1;
// For tracks, -1 means disabled, so we can't use it for "unset"
res->current_video_track = res->current_audio_track =
res->current_subtitle_track = -2;
res->aspect_ratio = res->crop = res->deinterlace =
res->video_filter = nullptr;
for ( const auto& meta : metas )
{
#define COPY_META( field ) res->field = strdup( meta.second.c_str() ); \
if ( res->field == nullptr ) return VLC_ENOMEM;
switch ( meta.first )
{
case medialibrary::IMedia::MetadataType::Progress:
res->progress = atof( meta.second.c_str() );
break;
case medialibrary::IMedia::MetadataType::Speed:
res->rate = atof( meta.second.c_str() );
break;
case medialibrary::IMedia::MetadataType::Title:
res->current_title = atoi( meta.second.c_str() );
break;
case medialibrary::IMedia::MetadataType::VideoTrack:
res->current_video_track = atoi( meta.second.c_str() );
break;
case medialibrary::IMedia::MetadataType::AspectRatio:
COPY_META( aspect_ratio );
break;
case medialibrary::IMedia::MetadataType::Zoom:
res->zoom = atof( meta.second.c_str() );
break;
case medialibrary::IMedia::MetadataType::Crop:
COPY_META( crop );
break;
case medialibrary::IMedia::MetadataType::Deinterlace:
COPY_META( deinterlace );
break;
case medialibrary::IMedia::MetadataType::VideoFilter:
COPY_META( video_filter );
break;
case medialibrary::IMedia::MetadataType::AudioTrack:
res->current_audio_track = atoi( meta.second.c_str() );
break;
case medialibrary::IMedia::MetadataType::SubtitleTrack:
res->current_subtitle_track = atoi( meta.second.c_str() );
break;
default:
break;
}
#undef COPY_META
}
return VLC_SUCCESS;
}
int MediaLibrary::setMeta( medialibrary::IMedia& media, int meta, const char* value )
{
bool res;
@ -993,6 +1056,39 @@ int MediaLibrary::setMeta( medialibrary::IMedia& media, int meta, const char* va
return VLC_SUCCESS;
}
int MediaLibrary::setMeta( medialibrary::IMedia& media,
const vlc_ml_playback_states_all* values )
{
using MT = medialibrary::IMedia::MetadataType;
std::unordered_map<MT, std::string> metas;
if ( values->progress >= .0f )
metas[MT::Progress] = std::to_string( values->progress );
if ( values->rate != .0f )
metas[MT::Speed] = std::to_string( values->rate );
if ( values->zoom != .0f )
metas[MT::Zoom] = std::to_string( values->zoom );
if ( values->current_title >= 0 )
metas[MT::Title] = std::to_string( values->current_title );
if ( values->aspect_ratio != nullptr )
metas[MT::AspectRatio] = values->aspect_ratio;
if ( values->crop != nullptr )
metas[MT::Crop] = values->crop;
if ( values->deinterlace != nullptr )
metas[MT::Deinterlace] = values->deinterlace;
if ( values->video_filter != nullptr )
metas[MT::VideoFilter] = values->video_filter;
if ( values->current_video_track != -2 )
metas[MT::VideoTrack] = std::to_string( values->current_video_track );
if ( values->current_audio_track != -2 )
metas[MT::AudioTrack] = std::to_string( values->current_audio_track );
if ( values->current_subtitle_track != -2 )
metas[MT::SubtitleTrack] = std::to_string( values->current_subtitle_track );
if ( media.setMetadata( std::move( metas ) ) == false )
return VLC_EGENERIC;
return VLC_SUCCESS;
}
int MediaLibrary::controlMedia( int query, va_list args )
{
auto mediaId = va_arg( args, int64_t );
@ -1017,6 +1113,16 @@ int MediaLibrary::controlMedia( int query, va_list args )
auto value = va_arg( args, const char* );
return setMeta( *m, meta, value );
}
case VLC_ML_MEDIA_GET_ALL_MEDIA_PLAYBACK_STATES:
{
auto res = va_arg( args, vlc_ml_playback_states_all* );
return getMeta( *m, res );
}
case VLC_ML_MEDIA_SET_ALL_MEDIA_PLAYBACK_STATES:
{
auto res = va_arg( args, const vlc_ml_playback_states_all* );
return setMeta( *m, res );
}
case VLC_ML_MEDIA_SET_THUMBNAIL:
{
auto mrl = va_arg( args, const char* );

View File

@ -143,7 +143,9 @@ public:
private:
int controlMedia( int query, va_list args );
int getMeta( const medialibrary::IMedia& media, int meta, char** result );
int getMeta( const medialibrary::IMedia& media, vlc_ml_playback_states_all* result );
int setMeta( medialibrary::IMedia& media, int meta, const char* value );
int setMeta( medialibrary::IMedia& media, const vlc_ml_playback_states_all* values );
int filterListChildrenQuery( int query, int parentType );
int listAlbums( int listQuery, const medialibrary::QueryParameters* paramsPtr,
const char* pattern, uint32_t nbItems, uint32_t offset, va_list args );

View File

@ -339,6 +339,14 @@ void vlc_ml_entry_point_list_release( vlc_ml_entry_point_list_t* p_list )
free( p_list );
}
void vlc_ml_playback_states_all_release( vlc_ml_playback_states_all* prefs )
{
free( prefs->aspect_ratio );
free( prefs->crop );
free( prefs->deinterlace );
free( prefs->video_filter );
}
void* vlc_ml_get( vlc_medialibrary_t* p_ml, int i_query, ... )
{
assert( p_ml != NULL );