diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f7dc04..8d1c252 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ -## 0.3.0+1 +## 0.4.0 + +* Adds support for older Android and iOS versions +* Adds an option to toggle the audio session behaviour on iOS +* Updates package dependencies + +* ## 0.3.0+1 * Update readme. diff --git a/android/build.gradle b/android/build.gradle index 02a6175..c8c30a1 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,7 +2,7 @@ group 'com.codevalop.raw_sound' version '1.0-SNAPSHOT' buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.8.21' repositories { google() jcenter() @@ -25,13 +25,14 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { - compileSdkVersion 30 + namespace 'com.codevalop.raw_sound' + compileSdkVersion 33 sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { - minSdkVersion 24 + minSdkVersion 23 } lintOptions { disable 'InvalidPackage' diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 0ef057f..98ecbca 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -38,7 +38,7 @@ android { defaultConfig { applicationId "com.codevalop.raw_sound_example" - minSdkVersion 24 + minSdkVersion 23 targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 62b415a..dcf4e6a 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> + location = "self:"> diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8b9c297..c87d15a 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ UIViewControllerBasedStatusBarAppearance + CADisableMinimumFrameDurationOnPhone + diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 8601a58..05eb136 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -6,7 +6,7 @@ description: Demonstrates how to use the raw_sound plugin. publish_to: 'none' # Remove this line if you wish to publish to pub.dev environment: - sdk: '>=2.12.0-133.2.beta <3.0.0' + sdk: '>=2.18.0 <3.0.0' dependencies: flutter: diff --git a/ios/Classes/RawSoundPlayer.swift b/ios/Classes/RawSoundPlayer.swift index b677091..9a84b86 100644 --- a/ios/Classes/RawSoundPlayer.swift +++ b/ios/Classes/RawSoundPlayer.swift @@ -14,8 +14,6 @@ public enum PCMType: Int { } class RawSoundPlayer { - private let logger = Logger( - subsystem: "com.codevalop.raw_sound", category: "RawSoundPlayer") private let audioEngine = AVAudioEngine() private let playerNode = AVAudioPlayerNode() @@ -43,17 +41,18 @@ class RawSoundPlayer { private let pcmType: PCMType - init?(bufferSize: Int, sampleRate: Int, nChannels: Int, pcmType: PCMType) { + init?(bufferSize: Int, sampleRate: Int, nChannels: Int, pcmType: PCMType, configureAudioSession: Bool) { precondition( nChannels == 1 || nChannels == 2, "Only support one or two channels") - let session = AVAudioSession.sharedInstance() - do { - try session.setCategory(.playback, mode: .default) - } catch { - logger.error("\(error.localizedDescription)") - return nil + if(configureAudioSession) { + let session = AVAudioSession.sharedInstance() + do { + try session.setCategory(.playback, mode: .default) + } catch { + return nil + } } // init?(commonFormat: AVAudioCommonFormat, sampleRate: Double, channels: AVAudioChannelCount, interleaved: Bool) @@ -82,7 +81,6 @@ class RawSoundPlayer { playerNode, to: audioEngine.outputNode, format: outputFormat) audioEngine.prepare() buffers.reserveCapacity(buffersCacheSize) - logger.info("initialized") } func release() -> Bool { @@ -104,27 +102,21 @@ class RawSoundPlayer { func play() -> Bool { if !audioEngine.isRunning { - logger.error("audio engine is not running") + do { - logger.debug("--> starting audio engine") try audioEngine.start() - logger.debug("<-- starting audio engine") } catch { - logger.error("\(error.localizedDescription)") return false } } - logger.debug("--> starting player") + playerNode.play() - logger.debug("<-- starting player") isPaused = false queUseBuffer.async { - self.logger.debug("--> queUseBuffer") self.queUseBufferIdled.wait() defer { self.queUseBufferIdled.signal() - self.logger.debug("<-- queUseBuffer") } let n = self.buffersCacheSize - self.getBuffersCount() @@ -145,9 +137,7 @@ class RawSoundPlayer { buffer, completionCallbackType: .dataConsumed, completionHandler: { _ in - // self.logger.debug("--> completionHandler") self.semBufferUsed.signal() - // self.logger.debug("<-- completionHandler") } ) } @@ -163,13 +153,10 @@ class RawSoundPlayer { resetSemBufferAdded() } guard audioEngine.isRunning else { - logger.error("audio engine is not running") return true } if playerNode.isPlaying { - logger.debug("--> stopping player") playerNode.stop() - logger.debug("<-- stopping player") isPaused = false } return true @@ -177,7 +164,6 @@ class RawSoundPlayer { func pause() -> Bool { guard audioEngine.isRunning else { - logger.error("audio engine is not running") return false } if playerNode.isPlaying { @@ -189,7 +175,6 @@ class RawSoundPlayer { func resume() -> Bool { guard audioEngine.isRunning else { - logger.error("audio engine is not running") return false } if !playerNode.isPlaying { @@ -201,22 +186,18 @@ class RawSoundPlayer { func feed(data: [UInt8], onDone: @escaping (_ r: Bool) -> Void) { guard audioEngine.isRunning else { - logger.error("audio engine is not running") onDone(false) return } guard playerNode.isPlaying else { - logger.error("player is not playing") onDone(true) return } queAddBuffer.async { - // self.logger.debug("--> queAddBuffer") self.queAddBufferIdled.wait() defer { self.queAddBufferIdled.signal() - // self.logger.debug("<-- queAddBuffer") } let buffer = self.dataToBuffer(data) self.addBuffer(buffer) @@ -235,7 +216,6 @@ class RawSoundPlayer { func setVolume(_ volume: Float) -> Bool { guard audioEngine.isRunning else { - logger.error("audio engine is not running") return false } playerNode.volume = volume @@ -291,9 +271,6 @@ class RawSoundPlayer { } // let iData = audioBuffer.int16ChannelData![0] - // self.logger.debug( - // "iData: \(iData[0]) \(iData[1]) \(iData[2]) \(iData[3]) \(iData[4]) \(iData[5]) \(iData[6]) ..." - // ) let audioConverter = AVAudioConverter(from: inputFormat, to: outputFormat)! let ratio = Double(outputFormat.sampleRate) / Double(inputFormat.sampleRate) @@ -309,21 +286,6 @@ class RawSoundPlayer { return audioBuffer }) - if r != .haveData { - logger.debug("unexpected convert result: \(r.rawValue)") - } - - if let err = error { - logger.error("\(err.localizedDescription)") - } - - // logger.debug("convertedAudioBuffer.frameLength: \(convertedAudioBuffer.frameLength)") - - // let fData = convertedAudioBuffer.floatChannelData![0] - // self.logger.debug( - // "fData: \(fData[0]) \(fData[1]) \(fData[2]) \(fData[3]) \(fData[4]) \(fData[5]) \(fData[6]) ..." - // ) - return convertedAudioBuffer } diff --git a/ios/Classes/RawSoundPlugin.swift b/ios/Classes/RawSoundPlugin.swift index 2dd5fe5..415955d 100644 --- a/ios/Classes/RawSoundPlugin.swift +++ b/ios/Classes/RawSoundPlugin.swift @@ -11,16 +11,12 @@ public class RawSoundPlugin: NSObject, FlutterPlugin { registrar.addMethodCallDelegate(instance, channel: channel) } - private let logger = Logger( - subsystem: "com.codevalop.raw_sound", category: "RawSoundPlugin") - private let channel: FlutterMethodChannel private var players = [RawSoundPlayer]() init(channel: FlutterMethodChannel) { self.channel = channel super.init() - logger.info("initialized") } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { @@ -33,13 +29,10 @@ public class RawSoundPlugin: NSObject, FlutterPlugin { if playerNo < 0 || playerNo > players.count - 1 { result( FlutterError(code: "Invalid Args", message: "Invalid playerNo: $playerNo", details: nil)) - logger.error("Invalid playerNo: \(playerNo)") return } } - // logger.debug("call.method: \(call.method)") - switch call.method { case "getPlatformVersion": result("iOS \(UIDevice.current.systemVersion)") @@ -48,9 +41,12 @@ public class RawSoundPlugin: NSObject, FlutterPlugin { let sampleRate = args["sampleRate"] as! Int let nChannels = args["nChannels"] as! Int let pcmType: PCMType = PCMType(rawValue: args["pcmType"] as! Int)! + let configureAudioSession = args["configureAudioSession"] as! Bool initialize( bufferSize: bufferSize, sampleRate: sampleRate, - nChannels: nChannels, pcmType: pcmType, result: result) + nChannels: nChannels, pcmType: pcmType, configureAudioSession: configureAudioSession, + result: result + ) case "release": release(playerNo: playerNo, result: result) case "play": @@ -64,8 +60,6 @@ public class RawSoundPlugin: NSObject, FlutterPlugin { case "feed": let _data = args["data"] as! FlutterStandardTypedData let data: [UInt8] = [UInt8](_data.data) - // logger.debug("data: \(data[0]) \(data[1]) \(data[2]) \(data[3]) ...") - // logger.debug("data.count: \(data.count)") feed(playerNo: playerNo, data: data, result: result) case "setVolume": let volume = args["volume"] as! Float @@ -91,13 +85,14 @@ public class RawSoundPlugin: NSObject, FlutterPlugin { } private func initialize( - bufferSize: Int, sampleRate: Int, nChannels: Int, pcmType: PCMType, + bufferSize: Int, sampleRate: Int, nChannels: Int, pcmType: PCMType, configureAudioSession: Bool, result: @escaping FlutterResult ) { guard let player = RawSoundPlayer( bufferSize: bufferSize, sampleRate: sampleRate, - nChannels: nChannels, pcmType: pcmType) + nChannels: nChannels, pcmType: pcmType, + configureAudioSession: configureAudioSession) else { sendResultError( "Error", message: "Failed to initalize", details: nil, result: result) diff --git a/ios/raw_sound.podspec b/ios/raw_sound.podspec index 1869aea..3128614 100644 --- a/ios/raw_sound.podspec +++ b/ios/raw_sound.podspec @@ -15,7 +15,7 @@ A new flutter plugin project. s.source = { :path => '.' } s.source_files = 'Classes/**/*' s.dependency 'Flutter' - s.platform = :ios, '14.0' + s.platform = :ios, '12.0' # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } diff --git a/lib/raw_sound_platform.dart b/lib/raw_sound_platform.dart index d210a56..d2ce616 100644 --- a/lib/raw_sound_platform.dart +++ b/lib/raw_sound_platform.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:typed_data'; + import 'package:flutter/services.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; @@ -28,12 +29,14 @@ class RawSoundPlayerPlatform extends PlatformInterface { int nChannels = 1, int sampleRate = 16000, int pcmType = 0, + bool configureAudioSession = true, }) async { final playerNo = await _channel.invokeMethod('initialize', { 'bufferSize': bufferSize, 'nChannels': nChannels, 'sampleRate': sampleRate, 'pcmType': pcmType, + 'configureAudioSession': configureAudioSession, }); _players[player] = playerNo!; } diff --git a/lib/raw_sound_player.dart b/lib/raw_sound_player.dart index 8206205..52b9a9c 100644 --- a/lib/raw_sound_player.dart +++ b/lib/raw_sound_player.dart @@ -1,8 +1,8 @@ import 'dart:async'; import 'dart:typed_data'; -import 'package:synchronized/synchronized.dart'; import 'package:raw_sound/raw_sound_platform.dart'; +import 'package:synchronized/synchronized.dart'; /// Raw PCM format type enum RawSoundPCMType { @@ -72,6 +72,7 @@ class RawSoundPlayer implements RawSoundPlayerPrototype { int nChannels = 1, int sampleRate = 16000, RawSoundPCMType pcmType = RawSoundPCMType.PCMI16, + bool configureAudioSession = true, }) async { print('RS:---> initialize'); @@ -84,6 +85,7 @@ class RawSoundPlayer implements RawSoundPlayerPrototype { nChannels: nChannels, sampleRate: sampleRate, pcmType: pcmType.index, + configureAudioSession: configureAudioSession, ); _playState = PlayState.stopped; _isInited = true; diff --git a/pubspec.yaml b/pubspec.yaml index d4e3d0b..6446b2d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,18 +1,18 @@ name: raw_sound description: A flutter plugin for playing raw PCM audio data (16-bit integer and 32-bit float). -version: 0.3.0+1 +version: 0.4.0 homepage: https://github.com/8fdafs2/flutter_raw_sound repository: https://github.com/8fdafs2/flutter_raw_sound environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=2.12.0 <4.0.0' flutter: '>=1.10.0' dependencies: flutter: sdk: flutter - synchronized: ^3.0.0 - plugin_platform_interface: ^2.0.0 + synchronized: ^3.1.0 + plugin_platform_interface: ^2.1.4 dev_dependencies: flutter_test: