[vlc-commits] macosx/player controller: expose teletext and spu options and add playback convinience methods
Felix Paul Kühne
git at videolan.org
Mon Feb 4 22:45:00 CET 2019
vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | Mon Feb 4 21:54:27 2019 +0100| [0be2cd9994ec148a03e157f8ccf56bd6d3c560a1] | committer: Felix Paul Kühne
macosx/player controller: expose teletext and spu options and add playback convinience methods
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0be2cd9994ec148a03e157f8ccf56bd6d3c560a1
---
modules/gui/macosx/playlist/VLCPlayerController.h | 126 +++++++++++++
modules/gui/macosx/playlist/VLCPlayerController.m | 207 +++++++++++++++++++++-
2 files changed, 329 insertions(+), 4 deletions(-)
diff --git a/modules/gui/macosx/playlist/VLCPlayerController.h b/modules/gui/macosx/playlist/VLCPlayerController.h
index 2e55196875..a5d2415fce 100644
--- a/modules/gui/macosx/playlist/VLCPlayerController.h
+++ b/modules/gui/macosx/playlist/VLCPlayerController.h
@@ -79,6 +79,30 @@ extern NSString *VLCPlayerTimeAndPositionChanged;
extern NSString *VLCPlayerLengthChanged;
/**
+ * Listen to VLCPlayerTeletextMenuAvailable to be notified if a teletext menu becomes (un-)available
+ * @note the affected player object will be the object of the notification
+ */
+extern NSString *VLCPlayerTeletextMenuAvailable;
+
+/**
+ * Listen to VLCPlayerTeletextEnabled to be notified if teletext becomes enabled or disabled
+ * @note the affected player object will be the object of the notification
+ */
+extern NSString *VLCPlayerTeletextEnabled;
+
+/**
+ * Listen to VLCPlayerTeletextPageChanged to be notified if the teletext page changes
+ * @note the affected player object will be the object of the notification
+ */
+extern NSString *VLCPlayerTeletextPageChanged;
+
+/**
+ * Listen to VLCPlayerTeletextTransparencyChanged to be notified if the teletext transparency changes
+ * @note the affected player object will be the object of the notification
+ */
+extern NSString *VLCPlayerTeletextTransparencyChanged;
+
+/**
* Listen to VLCPlayerAudioDelayChanged to be notified if the audio delay of the current media changes
* @note the affected player object will be the object of the notification
*/
@@ -295,6 +319,46 @@ extern NSString *VLCPlayerMuteChanged;
- (void)setPositionPrecise:(float)position;
/**
+ * helper function to jump forward with the extra short interval (user configurable in preferences)
+ */
+- (void)jumpForwardExtraShort;
+
+/**
+ * helper function to jump backward with the extra short interval (user configurable in preferences)
+ */
+- (void)jumpBackwardExtraShort;
+
+/**
+ * helper function to jump forward with the short interval (user configurable in preferences)
+ */
+- (void)jumpForwardShort;
+
+/**
+ * helper function to jump backward with the extra short interval (user configurable in preferences)
+ */
+- (void)jumpBackwardShort;
+
+/**
+ * helper function to jump forward with the medium interval (user configurable in preferences)
+ */
+- (void)jumpForwardMedium;
+
+/**
+ * helper function to jump backward with the medium interval (user configurable in preferences)
+ */
+- (void)jumpBackwardMedium;
+
+/**
+ * helper function to jump forward with the long interval (user configurable in preferences)
+ */
+- (void)jumpForwardLong;
+
+/**
+ * helper function to jump forward with the long interval (user configurable in preferences)
+ */
+- (void)jumpBackwardLong;
+
+/**
* the length of the currently playing media in ticks
* @return a valid time or VLC_TICK_INVALID (if no media is set, the media
* doesn't have any length, if playback is not yet started or in case of error)
@@ -304,6 +368,37 @@ extern NSString *VLCPlayerMuteChanged;
@property (readonly) vlc_tick_t length;
/**
+ * exposes whether a teletext menu is available or not
+ * @note listen to VLCPlayerTeletextMenuAvailable to be notified about changes to this property
+ */
+ at property (readonly) BOOL teletextMenuAvailable;
+
+/**
+ * enable/disable teletext display
+ * @note listen to VLCPlayerTeletextEnabled to be notified about changes to this property
+ */
+ at property (readwrite, nonatomic) BOOL teletextEnabled;
+
+/**
+ * set/get the currently displayed (or looked for) teletext page
+ *
+ * @note Page keys can be the following: @ref VLC_PLAYER_TELETEXT_KEY_RED,
+ * @ref VLC_PLAYER_TELETEXT_KEY_GREEN, @ref VLC_PLAYER_TELETEXT_KEY_YELLOW,
+ * @ref VLC_PLAYER_TELETEXT_KEY_BLUE or @ref VLC_PLAYER_TELETEXT_KEY_INDEX.
+ *
+ * @param page a page in the range 0 to 888 or a valid key
+ * @note listen to VLCPlayerTeletextPageChanged to be notified about changes to this property
+ */
+ at property (readwrite, nonatomic) unsigned int teletextPage;
+
+/**
+ * is the teletext background transparent or not?
+ * @return a BOOL value indicating the current state
+ * @note listen to VLCPlayerTeletextTransparencyChanged to be notified about changes to this property
+ */
+ at property (readwrite, nonatomic) BOOL teletextTransparent;
+
+/**
* the audio delay for the current media
* @warning this property expects you to provide an absolute delay time
* @return the audio delay in vlc ticks
@@ -320,6 +415,12 @@ extern NSString *VLCPlayerMuteChanged;
@property (readwrite, nonatomic) vlc_tick_t subtitlesDelay;
/**
+ * a scale factor for text based subtitles, range 10 - 500, default 100
+ * @warning this does not have any effect on bitmapped subtitles
+ */
+ at property (readwrite, nonatomic) unsigned int subtitleTextScalingFactor;
+
+/**
* enable recording of the current media or check if it is being done
* @note listen to VLCPlayerRecordingChanged to be notified about changes to this property
*/
@@ -334,11 +435,21 @@ extern NSString *VLCPlayerMuteChanged;
@property (readwrite, nonatomic) BOOL fullscreen;
/**
+ * helper function to inverse the current fullscreen state
+ */
+- (void)toggleFullscreen;
+
+/**
* indicates whether video is displaed in wallpaper mode or shall to
* @note listen to VLCPlayerWallpaperModeChanged to be notified about changes to this property
*/
@property (readwrite, nonatomic) BOOL wallpaperMode;
+/**
+ * Take a snapshot of all vouts
+ */
+- (void)takeSnapshot;
+
#pragma mark - audio output properties
/**
@@ -349,11 +460,26 @@ extern NSString *VLCPlayerMuteChanged;
@property (readwrite, nonatomic) float volume;
/**
+ * helper function to increase volume by 5%
+ */
+- (void)incrementVolume;
+
+/**
+ * helper function to decrease volume by 5%
+ */
+- (void)decrementVolume;
+
+/**
* reveals or sets whether audio output is set to mute or not
* @note listen to VLCPlayerMuteChanged to be notified about changes to this property
*/
@property (readwrite, nonatomic) BOOL mute;
+/**
+ * helper function to inverse the current mute state
+ */
+- (void)toggleMute;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/modules/gui/macosx/playlist/VLCPlayerController.m b/modules/gui/macosx/playlist/VLCPlayerController.m
index d3f7ad5fef..76bde08df2 100644
--- a/modules/gui/macosx/playlist/VLCPlayerController.m
+++ b/modules/gui/macosx/playlist/VLCPlayerController.m
@@ -21,6 +21,7 @@
*****************************************************************************/
#import "VLCPlayerController.h"
+#import "main/VLCMain.h"
NSString *VLCPlayerCurrentMediaItem = @"VLCPlayerCurrentMediaItem";
NSString *VLCPlayerCurrentMediaItemChanged = @"VLCPlayerCurrentMediaItemChanged";
@@ -32,8 +33,13 @@ NSString *VLCPlayerRateChanged = @"VLCPlayerRateChanged";
NSString *VLCPlayerCapabilitiesChanged = @"VLCPlayerCapabilitiesChanged";
NSString *VLCPlayerTimeAndPositionChanged = @"VLCPlayerTimeAndPositionChanged";
NSString *VLCPlayerLengthChanged = @"VLCPlayerLengthChanged";
+NSString *VLCPlayerTeletextMenuAvailable = @"VLCPlayerTeletextMenuAvailable";
+NSString *VLCPlayerTeletextEnabled = @"VLCPlayerTeletextEnabled";
+NSString *VLCPlayerTeletextPageChanged = @"VLCPlayerTeletextPageChanged";
+NSString *VLCPlayerTeletextTransparencyChanged = @"VLCPlayerTeletextTransparencyChanged";
NSString *VLCPlayerAudioDelayChanged = @"VLCPlayerAudioDelayChanged";
NSString *VLCPlayerSubtitlesDelayChanged = @"VLCPlayerSubtitlesDelayChanged";
+NSString *VLCPlayerSubtitleTextScalingFactorChanged = @"VLCPlayerSubtitleTextScalingFactorChanged";
NSString *VLCPlayerRecordingChanged = @"VLCPlayerRecordingChanged";
NSString *VLCPlayerFullscreenChanged = @"VLCPlayerFullscreenChanged";
NSString *VLCPlayerWallpaperModeChanged = @"VLCPlayerWallpaperModeChanged";
@@ -57,8 +63,13 @@ NSString *VLCPlayerMuteChanged = @"VLCPlayerMuteChanged";
- (void)capabilitiesChanged:(int)newCapabilities;
- (void)position:(float)position andTimeChanged:(vlc_tick_t)time;
- (void)lengthChanged:(vlc_tick_t)length;
+- (void)teletextAvailibilityChanged:(BOOL)hasTeletextMenu;
+- (void)teletextEnabledChanged:(BOOL)teletextOn;
+- (void)teletextPageChanged:(unsigned int)page;
+- (void)teletextTransparencyChanged:(BOOL)isTransparent;
- (void)audioDelayChanged:(vlc_tick_t)audioDelay;
- (void)subtitlesDelayChanged:(vlc_tick_t)subtitlesDelay;
+- (void)subtitleTextScaleChanged:(unsigned int)subtitleTextScalingFactor;
- (void)recordingChanged:(BOOL)recording;
- (void)stopActionChanged:(enum vlc_player_media_stopped_action)stoppedAction;
@@ -145,6 +156,42 @@ static void cb_player_length_changed(vlc_player_t *p_player, vlc_tick_t newLengt
});
}
+static void cb_player_teletext_menu_availability_changed(vlc_player_t *p_player, bool hasTeletextMenu, void *p_data)
+{
+ VLC_UNUSED(p_player);
+ dispatch_async(dispatch_get_main_queue(), ^{
+ VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data;
+ [playerController teletextAvailibilityChanged:hasTeletextMenu];
+ });
+}
+
+static void cb_player_teletext_enabled_changed(vlc_player_t *p_player, bool teletextEnabled, void *p_data)
+{
+ VLC_UNUSED(p_player);
+ dispatch_async(dispatch_get_main_queue(), ^{
+ VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data;
+ [playerController teletextEnabledChanged:teletextEnabled];
+ });
+}
+
+static void cb_player_teletext_page_changed(vlc_player_t *p_player, unsigned page, void *p_data)
+{
+ VLC_UNUSED(p_player);
+ dispatch_async(dispatch_get_main_queue(), ^{
+ VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data;
+ [playerController teletextPageChanged:page];
+ });
+}
+
+static void cb_player_teletext_transparency_changed(vlc_player_t *p_player, bool isTransparent, void *p_data)
+{
+ VLC_UNUSED(p_player);
+ dispatch_async(dispatch_get_main_queue(), ^{
+ VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data;
+ [playerController teletextTransparencyChanged:isTransparent];
+ });
+}
+
static void cb_player_audio_delay_changed(vlc_player_t *p_player, vlc_tick_t newDelay, void *p_data)
{
VLC_UNUSED(p_player);
@@ -195,10 +242,10 @@ static const struct vlc_player_cbs player_callbacks = {
NULL, //cb_player_titles_changed,
NULL, //cb_player_title_selection_changed,
NULL, //cb_player_chapter_selection_changed,
- NULL, //cb_player_teletext_menu_changed,
- NULL, //cb_player_teletext_enabled_changed,
- NULL, //cb_player_teletext_page_changed,
- NULL, //cb_player_teletext_transparency_changed,
+ cb_player_teletext_menu_availability_changed,
+ cb_player_teletext_enabled_changed,
+ cb_player_teletext_page_changed,
+ cb_player_teletext_transparency_changed,
cb_player_audio_delay_changed,
cb_player_subtitle_delay_changed,
NULL, //cb_player_associated_subs_fps_changed,
@@ -497,6 +544,63 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
vlc_player_Unlock(_p_player);
}
+- (void)jumpWithValue:(char *)p_userDefinedJumpSize forward:(BOOL)shallJumpForward
+{
+ int64_t interval = var_InheritInteger(getIntf(), p_userDefinedJumpSize);
+ if (interval > 0) {
+ vlc_tick_t jumptime = vlc_tick_from_sec( interval );
+ if (!shallJumpForward)
+ jumptime = jumptime * -1;
+
+ /* No fask seek for jumps. Indeed, jumps can seek to the current position
+ * if not precise enough or if the jump value is too small. */
+ vlc_player_SeekByTime(_p_player,
+ jumptime,
+ VLC_PLAYER_SEEK_PRECISE,
+ VLC_PLAYER_WHENCE_RELATIVE);
+ }
+}
+
+- (void)jumpForwardExtraShort
+{
+ [self jumpWithValue:"extrashort-jump-size" forward:YES];
+}
+
+- (void)jumpBackwardExtraShort
+{
+ [self jumpWithValue:"extrashort-jump-size" forward:NO];
+}
+
+- (void)jumpForwardShort
+{
+ [self jumpWithValue:"short-jump-size" forward:YES];
+}
+
+- (void)jumpBackwardShort
+{
+ [self jumpWithValue:"short-jump-size" forward:NO];
+}
+
+- (void)jumpForwardMedium
+{
+ [self jumpWithValue:"medium-jump-size" forward:YES];
+}
+
+- (void)jumpBackwardMedium
+{
+ [self jumpWithValue:"medium-jump-size" forward:NO];
+}
+
+- (void)jumpForwardLong
+{
+ [self jumpWithValue:"long-jump-size" forward:YES];
+}
+
+- (void)jumpBackwardLong
+{
+ [self jumpWithValue:"long-jump-size" forward:NO];
+}
+
- (void)lengthChanged:(vlc_tick_t)length
{
_length = length;
@@ -504,6 +608,55 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
object:self];
}
+- (void)teletextAvailibilityChanged:(BOOL)hasTeletextMenu
+{
+ _teletextMenuAvailable = hasTeletextMenu;
+ [_defaultNotificationCenter postNotificationName:VLCPlayerTeletextTransparencyChanged
+ object:self];
+}
+
+- (void)teletextEnabledChanged:(BOOL)teletextOn
+{
+ _teletextEnabled = teletextOn;
+ [_defaultNotificationCenter postNotificationName:VLCPlayerTeletextEnabled
+ object:self];
+}
+
+- (void)setTeletextEnabled:(BOOL)teletextEnabled
+{
+ vlc_player_Lock(_p_player);
+ vlc_player_SetTeletextEnabled(_p_player, teletextEnabled);
+ vlc_player_Unlock(_p_player);
+}
+
+- (void)teletextPageChanged:(unsigned int)page
+{
+ _teletextPage = page;
+ [_defaultNotificationCenter postNotificationName:VLCPlayerTeletextPageChanged
+ object:self];
+}
+
+- (void)setTeletextPage:(unsigned int)teletextPage
+{
+ vlc_player_Lock(_p_player);
+ vlc_player_SelectTeletextPage(_p_player, teletextPage);
+ vlc_player_Unlock(_p_player);
+}
+
+- (void)teletextTransparencyChanged:(BOOL)isTransparent
+{
+ _teletextTransparent = isTransparent;
+ [_defaultNotificationCenter postNotificationName:VLCPlayerTeletextTransparencyChanged
+ object:self];
+}
+
+- (void)setTeletextTransparent:(BOOL)teletextTransparent
+{
+ vlc_player_Lock(_p_player);
+ vlc_player_SetTeletextTransparency(_p_player, teletextTransparent);
+ vlc_player_Unlock(_p_player);
+}
+
- (void)audioDelayChanged:(vlc_tick_t)audioDelay
{
_audioDelay = audioDelay;
@@ -532,6 +685,27 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
vlc_player_Unlock(_p_player);
}
+- (unsigned int)subtitleTextScalingFactor
+{
+ unsigned int ret = 100;
+ vlc_player_Lock(_p_player);
+ ret = vlc_player_GetSubtitleTextScale(_p_player);
+ vlc_player_Unlock(_p_player);
+ return ret;
+}
+
+- (void)setSubtitleTextScalingFactor:(unsigned int)subtitleTextScalingFactor
+{
+ if (subtitleTextScalingFactor < 10)
+ subtitleTextScalingFactor = 10;
+ if (subtitleTextScalingFactor > 500)
+ subtitleTextScalingFactor = 500;
+
+ vlc_player_Lock(_p_player);
+ vlc_player_SetSubtitleTextScale(_p_player, subtitleTextScalingFactor);
+ vlc_player_Unlock(_p_player);
+}
+
- (void)recordingChanged:(BOOL)recording
{
_enableRecording = recording;
@@ -560,6 +734,11 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
vlc_player_vout_SetFullscreen(_p_player, fullscreen);
}
+- (void)toggleFullscreen
+{
+ vlc_player_vout_SetFullscreen(_p_player, !_fullscreen);
+}
+
- (void)wallpaperModeChanged:(BOOL)wallpaperModeValue
{
_wallpaperMode = wallpaperModeValue;
@@ -572,6 +751,11 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
vlc_player_vout_SetWallpaperModeEnabled(_p_player, wallpaperMode);
}
+- (void)takeSnapshot
+{
+ vlc_player_vout_Snapshot(_p_player);
+}
+
#pragma mark - audio specific delegation
- (void)volumeChanged:(float)volume
@@ -586,6 +770,16 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
vlc_player_aout_SetVolume(_p_player, volume);
}
+- (void)incrementVolume
+{
+ vlc_player_aout_SetVolume(_p_player, _volume + 0.05);
+}
+
+- (void)decrementVolume
+{
+ vlc_player_aout_SetVolume(_p_player, _volume - 0.05);
+}
+
- (void)muteChanged:(BOOL)mute
{
_mute = mute;
@@ -598,4 +792,9 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
vlc_player_aout_Mute(_p_player, mute);
}
+- (void)toggleMute
+{
+ vlc_player_aout_Mute(_p_player, !_mute);
+}
+
@end
More information about the vlc-commits
mailing list