You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
455 lines
11 KiB
455 lines
11 KiB
/*****************************************************************************
|
|
* CoreInteraction.m: MacOS X interface module
|
|
*****************************************************************************
|
|
* Copyright (C) 2011 Felix Paul Kühne
|
|
* $Id$
|
|
*
|
|
* Authors: Felix Paul Kühne <fkuehne -at- videolan -dot- org>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
|
*****************************************************************************/
|
|
|
|
#import "CoreInteraction.h"
|
|
#import "intf.h"
|
|
#import "open.h"
|
|
#import <vlc_playlist.h>
|
|
#import <vlc_input.h>
|
|
#import <vlc_keys.h>
|
|
#import <vlc_osd.h>
|
|
#import <vlc_aout_intf.h>
|
|
#import <vlc/vlc.h>
|
|
#import <vlc_strings.h>
|
|
|
|
@implementation VLCCoreInteraction
|
|
static VLCCoreInteraction *_o_sharedInstance = nil;
|
|
|
|
+ (VLCCoreInteraction *)sharedInstance
|
|
{
|
|
return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
|
|
}
|
|
|
|
#pragma mark -
|
|
#pragma mark Initialization
|
|
|
|
- (id)init
|
|
{
|
|
if( _o_sharedInstance)
|
|
{
|
|
[self dealloc];
|
|
return _o_sharedInstance;
|
|
}
|
|
else
|
|
{
|
|
_o_sharedInstance = [super init];
|
|
b_lockAspectRatio = YES;
|
|
}
|
|
|
|
return _o_sharedInstance;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[[NSNotificationCenter defaultCenter] removeObserver: self];
|
|
[super dealloc];
|
|
}
|
|
|
|
- (void)awakeFromNib
|
|
{
|
|
[[NSNotificationCenter defaultCenter] addObserver: self
|
|
selector: @selector(applicationWillFinishLaunching:)
|
|
name: NSApplicationWillFinishLaunchingNotification
|
|
object: nil];
|
|
}
|
|
|
|
#pragma mark -
|
|
#pragma mark Playback Controls
|
|
|
|
- (void)play
|
|
{
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
bool empty;
|
|
|
|
PL_LOCK;
|
|
empty = playlist_IsEmpty( p_playlist );
|
|
PL_UNLOCK;
|
|
|
|
if( empty )
|
|
[[[VLCMain sharedInstance] open] openFileGeneric];
|
|
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE );
|
|
}
|
|
|
|
- (void)stop
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_STOP );
|
|
}
|
|
|
|
- (void)faster
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_FASTER );
|
|
}
|
|
|
|
- (void)slower
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_SLOWER );
|
|
}
|
|
|
|
- (void)normalSpeed
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_RATE_NORMAL );
|
|
}
|
|
|
|
- (void)toggleRecord
|
|
{
|
|
input_thread_t * p_input;
|
|
p_input = pl_CurrentInput( VLCIntf );
|
|
if( p_input )
|
|
{
|
|
var_ToggleBool( p_input, "record" );
|
|
vlc_object_release( p_input );
|
|
}
|
|
}
|
|
|
|
- (void)setPlaybackRate:(int)i_value
|
|
{
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
|
|
double speed = pow( 2, (double)i_value / 17 );
|
|
int rate = INPUT_RATE_DEFAULT / speed;
|
|
if( i_currentPlaybackRate != rate )
|
|
var_SetFloat( p_playlist, "rate", (float)INPUT_RATE_DEFAULT / (float)rate );
|
|
i_currentPlaybackRate = rate;
|
|
}
|
|
|
|
- (int)playbackRate
|
|
{
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
|
|
float rate = var_GetFloat( p_playlist, "rate" );
|
|
double value = 17 * log( rate ) / log( 2. );
|
|
int returnValue = (int) ( ( value > 0 ) ? value + .5 : value - .5 );
|
|
|
|
if( returnValue < -34 )
|
|
returnValue = -34;
|
|
else if( returnValue > 34 )
|
|
returnValue = 34;
|
|
|
|
i_currentPlaybackRate = returnValue;
|
|
return returnValue;
|
|
}
|
|
|
|
- (void)previous
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PREV );
|
|
}
|
|
|
|
- (void)next
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_NEXT );
|
|
}
|
|
|
|
- (BOOL)isPlaying
|
|
{
|
|
input_thread_t * p_input = pl_CurrentInput( VLCIntf );
|
|
|
|
if (!p_input) return NO;
|
|
|
|
input_state_e i_state = ERROR_S;
|
|
input_Control( p_input, INPUT_GET_STATE, &i_state);
|
|
vlc_object_release( p_input );
|
|
|
|
return ((i_state == OPENING_S) || (i_state == PLAYING_S));
|
|
}
|
|
|
|
- (int)currentTime
|
|
{
|
|
input_thread_t * p_input = pl_CurrentInput( VLCIntf );
|
|
int64_t i_currentTime = -1;
|
|
|
|
if (!p_input) return i_currentTime;
|
|
|
|
input_Control( p_input, INPUT_GET_TIME, &i_currentTime);
|
|
vlc_object_release( p_input );
|
|
|
|
return (int)( i_currentTime / 1000000 );
|
|
}
|
|
|
|
- (void)setCurrentTime:(int)i_value
|
|
{
|
|
int64_t i64_value = (int64_t)i_value;
|
|
input_thread_t * p_input = pl_CurrentInput( VLCIntf );
|
|
|
|
if (!p_input) return;
|
|
|
|
input_Control( p_input, INPUT_SET_TIME, (int64_t)(i64_value * 1000000));
|
|
vlc_object_release( p_input );
|
|
}
|
|
|
|
- (int)durationOfCurrentPlaylistItem
|
|
{
|
|
input_thread_t * p_input = pl_CurrentInput( VLCIntf );
|
|
int64_t i_duration = -1;
|
|
if (!p_input) return i_duration;
|
|
|
|
|
|
input_Control( p_input, INPUT_GET_LENGTH, &i_duration);
|
|
vlc_object_release( p_input );
|
|
|
|
return (int)(i_duration / 1000000);
|
|
}
|
|
|
|
- (NSURL*)URLOfCurrentPlaylistItem
|
|
{
|
|
input_thread_t *p_input = pl_CurrentInput( VLCIntf );
|
|
if (!p_input) return nil;
|
|
|
|
input_item_t *p_item = input_GetItem( p_input );
|
|
if (!p_item) return nil;
|
|
|
|
char *psz_uri = input_item_GetURI( p_item );
|
|
if (!psz_uri) return nil;
|
|
|
|
NSURL *o_url;
|
|
o_url = [NSURL URLWithString:[NSString stringWithUTF8String:psz_uri]];
|
|
|
|
return o_url;
|
|
}
|
|
|
|
- (NSString*)nameOfCurrentPlaylistItem
|
|
{
|
|
input_thread_t *p_input = pl_CurrentInput( VLCIntf );
|
|
if (!p_input) return nil;
|
|
|
|
input_item_t *p_item = input_GetItem( p_input );
|
|
if (!p_item) return nil;
|
|
|
|
char *psz_uri = input_item_GetURI( p_item );
|
|
if (!psz_uri) return nil;
|
|
|
|
NSString *o_name;
|
|
char *format = var_InheritString( VLCIntf, "input-title-format" );
|
|
char *formated = str_format_meta( p_input, format );
|
|
free( format );
|
|
o_name = [NSString stringWithUTF8String:formated];
|
|
free( formated );
|
|
|
|
NSURL * o_url = [NSURL URLWithString: [NSString stringWithUTF8String: psz_uri]];
|
|
free( psz_uri );
|
|
|
|
if ([o_name isEqualToString:@""])
|
|
{
|
|
if ([o_url isFileURL])
|
|
o_name = [[NSFileManager defaultManager] displayNameAtPath: [o_url path]];
|
|
else
|
|
o_name = [o_url absoluteString];
|
|
}
|
|
return o_name;
|
|
}
|
|
|
|
- (void)forward
|
|
{
|
|
//LEGACY SUPPORT
|
|
[self forwardShort];
|
|
}
|
|
|
|
- (void)backward
|
|
{
|
|
//LEGACY SUPPORT
|
|
[self backwardShort];
|
|
}
|
|
|
|
- (void)forwardExtraShort
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_EXTRASHORT );
|
|
}
|
|
|
|
- (void)backwardExtraShort
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_EXTRASHORT );
|
|
}
|
|
|
|
- (void)forwardShort
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT );
|
|
}
|
|
|
|
- (void)backwardShort
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT );
|
|
}
|
|
|
|
- (void)forwardMedium
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_MEDIUM );
|
|
}
|
|
|
|
- (void)backwardMedium
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_MEDIUM );
|
|
}
|
|
|
|
- (void)forwardLong
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_LONG );
|
|
}
|
|
|
|
- (void)backwardLong
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_LONG );
|
|
}
|
|
|
|
- (void)shuffle
|
|
{
|
|
vlc_value_t val;
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
vout_thread_t *p_vout = getVout();
|
|
|
|
var_Get( p_playlist, "random", &val );
|
|
val.b_bool = !val.b_bool;
|
|
var_Set( p_playlist, "random", val );
|
|
if( val.b_bool )
|
|
{
|
|
if (p_vout)
|
|
{
|
|
vout_OSDMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Random On" ) );
|
|
vlc_object_release( p_vout );
|
|
}
|
|
config_PutInt( p_playlist, "random", 1 );
|
|
}
|
|
else
|
|
{
|
|
if (p_vout)
|
|
{
|
|
vout_OSDMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Random Off" ) );
|
|
vlc_object_release( p_vout );
|
|
}
|
|
config_PutInt( p_playlist, "random", 0 );
|
|
}
|
|
}
|
|
|
|
- (void)repeatAll
|
|
{
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
|
|
var_SetBool( p_playlist, "repeat", NO );
|
|
var_SetBool( p_playlist, "loop", YES );
|
|
config_PutInt( p_playlist, "repeat", NO );
|
|
config_PutInt( p_playlist, "loop", YES );
|
|
|
|
vout_thread_t *p_vout = getVout();
|
|
if (p_vout)
|
|
{
|
|
vout_OSDMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat All" ) );
|
|
vlc_object_release( p_vout );
|
|
}
|
|
}
|
|
|
|
- (void)repeatOne
|
|
{
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
|
|
var_SetBool( p_playlist, "repeat", YES );
|
|
var_SetBool( p_playlist, "loop", NO );
|
|
config_PutInt( p_playlist, "repeat", YES );
|
|
config_PutInt( p_playlist, "loop", NO );
|
|
|
|
vout_thread_t *p_vout = getVout();
|
|
if (p_vout)
|
|
{
|
|
vout_OSDMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat One" ) );
|
|
vlc_object_release( p_vout );
|
|
}
|
|
}
|
|
|
|
- (void)repeatOff
|
|
{
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
|
|
var_SetBool( p_playlist, "repeat", NO );
|
|
var_SetBool( p_playlist, "loop", NO );
|
|
config_PutInt( p_playlist, "repeat", NO );
|
|
config_PutInt( p_playlist, "loop", NO );
|
|
|
|
vout_thread_t *p_vout = getVout();
|
|
if (p_vout)
|
|
{
|
|
vout_OSDMessage( p_vout, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat Off" ) );
|
|
vlc_object_release( p_vout );
|
|
}
|
|
}
|
|
|
|
- (void)volumeUp
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_VOL_UP );
|
|
}
|
|
|
|
- (void)volumeDown
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_VOL_DOWN );
|
|
}
|
|
|
|
- (void)mute
|
|
{
|
|
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_VOL_MUTE );
|
|
}
|
|
|
|
- (BOOL)isMuted
|
|
{
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
BOOL b_is_muted = NO;
|
|
b_is_muted = aout_IsMuted( VLC_OBJECT(p_playlist) );
|
|
|
|
return b_is_muted;
|
|
}
|
|
|
|
- (int)volume
|
|
{
|
|
intf_thread_t * p_intf = VLCIntf;
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
audio_volume_t i_volume = aout_VolumeGet( p_playlist );
|
|
|
|
return (int)i_volume;
|
|
}
|
|
|
|
- (void)setVolume: (int)i_value
|
|
{
|
|
intf_thread_t * p_intf = VLCIntf;
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
audio_volume_t i_volume = (audio_volume_t)i_value;
|
|
int i_volume_step;
|
|
i_volume_step = config_GetInt( VLCIntf->p_libvlc, "volume-step" );
|
|
aout_VolumeSet( p_playlist, i_volume * i_volume_step );
|
|
}
|
|
|
|
#pragma mark -
|
|
#pragma mark video output stuff
|
|
|
|
- (void)setAspectRatioLocked:(BOOL)b_value
|
|
{
|
|
b_lockAspectRatio = b_value;
|
|
}
|
|
|
|
- (BOOL)aspectRatioIsLocked
|
|
{
|
|
return b_lockAspectRatio;
|
|
}
|
|
|
|
- (void)toggleFullscreen
|
|
{
|
|
playlist_t * p_playlist = pl_Get( VLCIntf );
|
|
var_ToggleBool( p_playlist, "fullscreen" );
|
|
}
|
|
|
|
@end
|
|
|