Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
## 2.0.1 [June 12, 2021]

* Set iOS deployment target to 9.0
* Fixed observed value unhandled exception in iOS implementation

## 2.0.0 [June 11, 2021]

* Migrated to null-safety

## 1.0.43 [June 8, 2021]

* Updated iOS deployment target to 9.0

## 1.0.42 [November 10, 2020]

* Merged [PR](https://github.com/muslimtv/flutter_playout/pull/70)

## 1.0.41 [September 13, 2020]

* removed isEmpty check when setting text track language

## 1.0.40 [September 7, 2020]

* added support for text tracks for Android
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion example/.flutter-plugins-dependencies
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_playout","path":"/Users/Khuram/Projects/flutter_playout/","dependencies":[]}],"android":[{"name":"flutter_playout","path":"/Users/Khuram/Projects/flutter_playout/","dependencies":[]}],"macos":[],"linux":[],"windows":[],"web":[]},"dependencyGraph":[{"name":"flutter_playout","dependencies":[]}],"date_created":"2020-09-07 14:04:25.413425","version":"1.20.3"}
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_playout","path":"/Users/Khuram/Projects/flutter_playout/","dependencies":[]}],"android":[{"name":"flutter_playout","path":"/Users/Khuram/Projects/flutter_playout/","dependencies":[]}],"macos":[],"linux":[],"windows":[],"web":[]},"dependencyGraph":[{"name":"flutter_playout","dependencies":[]}],"date_created":"2021-06-11 23:49:06.068825","version":"2.2.1"}
1 change: 1 addition & 0 deletions example/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ class _VideoPlayoutState extends State<VideoPlayout>
languageCode: "fr",
uri: "https://texttracks.example.com/french.vtt"),
],
loop: false,
),
),
/* multi language menu */
Expand Down
2 changes: 1 addition & 1 deletion example/ios/Flutter/.last_build_id
Original file line number Diff line number Diff line change
@@ -1 +1 @@
46421090b226fe359c3c6937c1ad9913
7e31c1523c8179c5a7977e376350a63f
8 changes: 4 additions & 4 deletions example/ios/Flutter/Flutter.podspec
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
#
# NOTE: This podspec is NOT to be published. It is only used as a local source!
# This is a generated file; do not edit or check into version control.
#

Pod::Spec.new do |s|
s.name = 'Flutter'
s.version = '1.0.0'
s.summary = 'High-performance, high-fidelity mobile apps.'
s.description = <<-DESC
Flutter provides an easy and productive way to build and deploy high-performance mobile apps for Android and iOS.
DESC
s.homepage = 'https://flutter.io'
s.license = { :type => 'MIT' }
s.author = { 'Flutter Dev Team' => '[email protected]' }
s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.vendored_frameworks = 'Flutter.framework'
# Framework linking is handled by Flutter tooling, not CocoaPods.
# Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs.
s.vendored_frameworks = 'path/to/nothing'
end
4 changes: 2 additions & 2 deletions example/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_playout/ios"

SPEC CHECKSUMS:
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
flutter_playout: a5aed32b3003b02eb4432815ecfe0c0e42a801ff

PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c

COCOAPODS: 1.8.3
COCOAPODS: 1.10.0
8 changes: 3 additions & 5 deletions example/ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -263,12 +263,10 @@
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
"${PODS_ROOT}/../Flutter/Flutter.framework",
"${BUILT_PRODUCTS_DIR}/flutter_playout/flutter_playout.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_playout.framework",
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down Expand Up @@ -351,7 +349,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
Expand Down Expand Up @@ -434,7 +432,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
Expand Down Expand Up @@ -483,7 +481,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions example/lib/video.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class VideoPlayout extends StatefulWidget {
class _VideoPlayoutState extends State<VideoPlayout>
with PlayerObserver, MultiAudioSupport {
final String _url = null;
List<HLSManifestLanguage> _hlsLanguages = List<HLSManifestLanguage>();
List<HLSManifestLanguage> _hlsLanguages = [];

@override
void initState() {
Expand Down Expand Up @@ -51,12 +51,13 @@ class _VideoPlayoutState extends State<VideoPlayout>
title: "MTA International",
subtitle: "Reaching The Corners Of The Earth",
preferredAudioLanguage: "eng",
isLiveStream: true,
isLiveStream: false,
position: 0,
url: _url,
onViewCreated: _onViewCreated,
desiredState: widget.desiredState,
preferredTextLanguage: "en",
loop: false,
),
),
/* multi language menu */
Expand Down
41 changes: 21 additions & 20 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -7,42 +7,42 @@ packages:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.4.2"
version: "2.6.1"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.3"
version: "1.2.0"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
version: "1.14.13"
version: "1.15.0"
cupertino_icons:
dependency: "direct main"
description:
Expand All @@ -56,7 +56,7 @@ packages:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
version: "1.2.0"
flutter:
dependency: "direct main"
description: flutter
Expand All @@ -68,7 +68,7 @@ packages:
path: ".."
relative: true
source: path
version: "1.0.39"
version: "1.0.44"
flutter_test:
dependency: "direct dev"
description: flutter
Expand All @@ -94,21 +94,21 @@ packages:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.8"
version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.8"
version: "1.3.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.7.0"
version: "1.8.0"
pedantic:
dependency: transitive
description:
Expand All @@ -127,55 +127,56 @@ packages:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.7.0"
version: "1.8.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "1.9.5"
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.5"
version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.17"
version: "0.3.0"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.8"
version: "2.1.0"
sdks:
dart: ">=2.9.0-14.0.dev <3.0.0"
dart: ">=2.12.0 <3.0.0"
flutter: ">=1.12.13+hotfix.6"
61 changes: 32 additions & 29 deletions ios/Classes/AudioPlayer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,11 @@ class AudioPlayer: NSObject, FlutterPlugin, FlutterStreamHandler {
/* Add observer for AVPlayer status and AVPlayerItem status */
self.audioPlayer.addObserver(self, forKeyPath: #keyPath(AVPlayer.status), options: [.new, .initial], context: nil)
self.audioPlayer.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options:[.old, .new, .initial], context: nil)
self.audioPlayer.addObserver(self, forKeyPath: #keyPath(AVPlayer.timeControlStatus), options:[.old, .new, .initial], context: nil)
if #available(iOS 10.0, *) {
self.audioPlayer.addObserver(self, forKeyPath: #keyPath(AVPlayer.timeControlStatus), options:[.old, .new, .initial], context: nil)
} else {
// Fallback on earlier versions
}

let interval = CMTime(seconds: 1.0,
preferredTimescale: CMTimeScale(NSEC_PER_SEC))
Expand Down Expand Up @@ -201,48 +205,47 @@ class AudioPlayer: NSObject, FlutterPlugin, FlutterStreamHandler {
/* Observe If AVPlayerItem.status Changed to Fail */
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {

if keyPath == #keyPath(AVPlayerItem.status) {

let newStatus: AVPlayerItem.Status

if let newStatusAsNumber = change?[NSKeyValueChangeKey.newKey] as? NSNumber {
newStatus = AVPlayerItem.Status(rawValue: newStatusAsNumber.intValue)!
} else {
newStatus = .unknown
}

if newStatus == .failed {
self.flutterEventSink?(["name":"onError", "error":(String(describing: self.audioPlayer.currentItem?.error))])
} else if newStatus == .readyToPlay {
self.flutterEventSink?(["name":"onReady"])
}
}

else if keyPath == #keyPath(AVPlayer.timeControlStatus) {

guard let p = object as! AVPlayer? else {
return
if keyPath == #keyPath(AVPlayerItem.status) {

let newStatus: AVPlayerItem.Status

if let newStatusAsNumber = change?[NSKeyValueChangeKey.newKey] as? NSNumber {
newStatus = AVPlayerItem.Status(rawValue: newStatusAsNumber.intValue)!
} else {
newStatus = .unknown
}

if newStatus == .failed {
self.flutterEventSink?(["name":"onError", "error":(String(describing: self.audioPlayer.currentItem?.error))])
} else if newStatus == .readyToPlay {
self.flutterEventSink?(["name":"onReady"])
}
}

if #available(iOS 10.0, *) {
if #available(iOS 10.0, *) {
if keyPath == #keyPath(AVPlayer.timeControlStatus) {

guard let p = object as! AVPlayer? else {
return
}

switch (p.timeControlStatus) {

case AVPlayerTimeControlStatus.paused:
case AVPlayer.TimeControlStatus.paused:
self.flutterEventSink?(["name":"onPause"])
break

case AVPlayerTimeControlStatus.playing:
case AVPlayer.TimeControlStatus.playing:
self.flutterEventSink?(["name":"onPlay"])
break

case .waitingToPlayAtSpecifiedRate: break
@unknown default:
break
}
} else {
// Fallback on earlier versions
}
} else {
// Fallback on earlier versions
}
}

Expand Down
Loading