diff options
Diffstat (limited to 'platform')
| -rw-r--r-- | platform/iphone/detect.py | 4 | ||||
| -rwxr-xr-x | platform/iphone/gl_view.h | 8 | ||||
| -rwxr-xr-x | platform/iphone/gl_view.mm | 88 | ||||
| -rw-r--r-- | platform/iphone/os_iphone.cpp | 6 | ||||
| -rw-r--r-- | platform/iphone/os_iphone.h | 2 | ||||
| -rw-r--r-- | platform/windows/packet_peer_udp_winsock.cpp | 2 |
6 files changed, 101 insertions, 9 deletions
diff --git a/platform/iphone/detect.py b/platform/iphone/detect.py index c25742a854..acab6fe546 100644 --- a/platform/iphone/detect.py +++ b/platform/iphone/detect.py @@ -21,7 +21,8 @@ def get_opts(): return [ ('IPHONEPLATFORM', 'name of the iphone platform', 'iPhoneOS'), ('IPHONEPATH', 'the path to iphone toolchain', '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain'), - ('IOS_SDK_VERSION', 'The SDK version', 'iPhoneOS7.0'), + #('IOS_SDK_VERSION', 'The SDK version', 'iPhoneOS7.0'), + ('IOS_SDK_VERSION', 'The SDK version', 'iPhoneOS8.1'), ('IPHONESDK', 'path to the iphone SDK', '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/${IOS_SDK_VERSION}.sdk/'), ('game_center', 'Support for game center', 'yes'), ('store_kit', 'Support for in-app store', 'yes'), @@ -79,6 +80,7 @@ def configure(env): '-framework', 'Security', #'-framework', 'AdSupport', '-framework', 'MediaPlayer', + '-framework', 'AVFoundation', ]) if env['game_center'] == 'yes': diff --git a/platform/iphone/gl_view.h b/platform/iphone/gl_view.h index 3e6181ab90..8ae7c2f87d 100755 --- a/platform/iphone/gl_view.h +++ b/platform/iphone/gl_view.h @@ -32,6 +32,7 @@ #import <OpenGLES/ES1/gl.h> #import <OpenGLES/ES1/glext.h> #import <MediaPlayer/MediaPlayer.h> +#import <AVFoundation/AVFoundation.h> @protocol GLViewDelegate; @@ -66,6 +67,13 @@ @property(nonatomic, assign) id<GLViewDelegate> delegate; +// AVPlayer-related properties +@property(strong, nonatomic) AVAsset *avAsset; +@property(strong, nonatomic) AVPlayerItem *avPlayerItem; +@property(strong, nonatomic) AVPlayer *avPlayer; +@property(strong, nonatomic) AVPlayerLayer *avPlayerLayer; + +// Old videoplayer properties @property(strong, nonatomic) MPMoviePlayerController *moviePlayerController; @property(strong, nonatomic) UIWindow *backgroundWindow; diff --git a/platform/iphone/gl_view.mm b/platform/iphone/gl_view.mm index 06b679c305..a25e740883 100755 --- a/platform/iphone/gl_view.mm +++ b/platform/iphone/gl_view.mm @@ -65,6 +65,7 @@ void _hide_keyboard() { keyboard_text = ""; }; +/* bool _play_video(String p_path, float p_volume) { float player_volume = p_volume * AudioServer::get_singleton()->get_singleton()->get_stream_global_volume_scale(); @@ -96,24 +97,87 @@ bool _play_video(String p_path, float p_volume) { return true; } +*/ + +bool _play_video(String p_path, float p_volume, String p_audio_track, String p_subtitle_track) { + p_path = Globals::get_singleton()->globalize_path(p_path); + + NSString* file_path = [[[NSString alloc] initWithUTF8String:p_path.utf8().get_data()] autorelease]; + //NSURL *file_url = [NSURL fileURLWithPath:file_path]; + + _instance.avAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:file_path]]; + _instance.avPlayerItem =[[AVPlayerItem alloc]initWithAsset:_instance.avAsset]; + _instance.avPlayer = [[AVPlayer alloc]initWithPlayerItem:_instance.avPlayerItem]; + _instance.avPlayerLayer =[AVPlayerLayer playerLayerWithPlayer:_instance.avPlayer]; + + [_instance.avPlayer addObserver:_instance forKeyPath:@"status" options:0 context:nil]; + [[NSNotificationCenter defaultCenter] addObserver:_instance + selector:@selector(playerItemDidReachEnd:) + name:AVPlayerItemDidPlayToEndTimeNotification + object:[_instance.avPlayer currentItem]]; + + [_instance.avPlayerLayer setFrame:_instance.bounds]; + [_instance.layer addSublayer:_instance.avPlayerLayer]; + [_instance.avPlayer play]; + + AVMediaSelectionGroup *audioGroup = [_instance.avAsset mediaSelectionGroupForMediaCharacteristic: AVMediaCharacteristicAudible]; + + for (id track in audioGroup.options) + { + NSString* language = [[track locale] localeIdentifier]; + NSLog(@"subtitle lang: %@", language); + + if ([language isEqualToString:[NSString stringWithUTF8String:p_audio_track.utf8()]]) + { + [_instance.avPlayer.currentItem selectMediaOption:track inMediaSelectionGroup: audioGroup]; + break; + } + } + + AVMediaSelectionGroup *subtitlesGroup = [_instance.avAsset mediaSelectionGroupForMediaCharacteristic: AVMediaCharacteristicLegible]; + NSArray *useableTracks = [AVMediaSelectionGroup mediaSelectionOptionsFromArray:subtitlesGroup.options withoutMediaCharacteristics:[NSArray arrayWithObject:AVMediaCharacteristicContainsOnlyForcedSubtitles]]; + + for (id track in useableTracks) + { + NSString* language = [[track locale] localeIdentifier]; + NSLog(@"subtitle lang: %@", language); + + if ([language isEqualToString:[NSString stringWithUTF8String:p_subtitle_track.utf8()]]) + { + [_instance.avPlayer.currentItem selectMediaOption:track inMediaSelectionGroup: subtitlesGroup]; + break; + } + } + + video_playing = true; + + return true; +} bool _is_video_playing() { //NSInteger playback_state = _instance.moviePlayerController.playbackState; - return video_playing || _instance.moviePlayerController.playbackState == MPMoviePlaybackStatePlaying; + //return video_playing || _instance.moviePlayerController.playbackState == MPMoviePlaybackStatePlaying; //if (video_found_error) // return false; //return (_instance.moviePlayerController.playbackState == MPMoviePlaybackStatePlaying); + + return video_playing || (_instance.avPlayer.rate > 0 && !_instance.avPlayer.error); } void _pause_video() { - [_instance.moviePlayerController pause]; + //[_instance.moviePlayerController pause]; + [_instance.avPlayer pause]; video_playing = false; } void _stop_video() { - [_instance.moviePlayerController stop]; - [_instance.moviePlayerController.view removeFromSuperview]; + //[_instance.moviePlayerController stop]; + //[_instance.moviePlayerController.view removeFromSuperview]; //[[MPMusicPlayerController applicationMusicPlayer] setVolume: video_previous_volume]; + + [_instance.avPlayer pause]; + [_instance.avPlayerLayer removeFromSuperlayer]; + _instance.avPlayer = nil; video_playing = false; } @@ -523,6 +587,21 @@ static void clear_touches() { [super dealloc]; } +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object + change:(NSDictionary *)change context:(void *)context { + if (object == _instance.avPlayer && [keyPath isEqualToString:@"status"]) { + if (_instance.avPlayer.status == AVPlayerStatusFailed) { + _stop_video(); + video_found_error = true; + } + } +} + +- (void)playerItemDidReachEnd:(NSNotification *)notification { + _stop_video(); +} + +/* - (void)moviePlayBackDidFinish:(NSNotification*)notification { @@ -557,5 +636,6 @@ static void clear_touches() { //[[MPMusicPlayerController applicationMusicPlayer] setVolume: video_previous_volume]; video_playing = false; } +*/ @end diff --git a/platform/iphone/os_iphone.cpp b/platform/iphone/os_iphone.cpp index 2ef732183b..dee018473a 100644 --- a/platform/iphone/os_iphone.cpp +++ b/platform/iphone/os_iphone.cpp @@ -485,13 +485,13 @@ String OSIPhone::get_locale() const { return locale_code; } -extern bool _play_video(String p_path, float p_volume); +extern bool _play_video(String p_path, float p_volume, String p_audio_track, String p_subtitle_track); extern bool _is_video_playing(); extern void _pause_video(); extern void _stop_video(); -Error OSIPhone::native_video_play(String p_path, float p_volume) { - if ( _play_video(p_path, p_volume) ) +Error OSIPhone::native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track) { + if ( _play_video(p_path, p_volume, p_audio_track, p_subtitle_track) ) return OK; return FAILED; } diff --git a/platform/iphone/os_iphone.h b/platform/iphone/os_iphone.h index 14b46816e9..7fb306ea13 100644 --- a/platform/iphone/os_iphone.h +++ b/platform/iphone/os_iphone.h @@ -184,7 +184,7 @@ public: void set_unique_ID(String p_ID); String get_unique_ID() const; - virtual Error native_video_play(String p_path, float p_volume); + virtual Error native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track); virtual bool native_video_is_playing() const; virtual void native_video_pause(); virtual void native_video_stop(); diff --git a/platform/windows/packet_peer_udp_winsock.cpp b/platform/windows/packet_peer_udp_winsock.cpp index c28d72c99c..aff92b8fc8 100644 --- a/platform/windows/packet_peer_udp_winsock.cpp +++ b/platform/windows/packet_peer_udp_winsock.cpp @@ -61,6 +61,8 @@ int PacketPeerUDPWinsock::get_max_packet_size() const{ void PacketPeerUDPWinsock::_set_blocking(bool p_blocking) { + //am no windows expert + //hope this is the right thing if (blocking==p_blocking) return; |