From 8a7b0d6a355251aabd5484636c93250c4e644d9c Mon Sep 17 00:00:00 2001 From: Hennie Date: Mon, 30 Jan 2023 16:03:01 +0200 Subject: [PATCH 1/8] Support older versions of Android and iOS --- android/build.gradle | 2 +- example/android/app/build.gradle | 2 +- .../android/app/src/main/AndroidManifest.xml | 2 +- example/ios/Podfile | 2 +- example/ios/Runner.xcodeproj/project.pbxproj | 2 +- .../contents.xcworkspacedata | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- example/ios/Runner/Info.plist | 2 + example/pubspec.yaml | 2 +- ios/Classes/RawSoundPlayer.swift | 44 +------------------ ios/Classes/RawSoundPlugin.swift | 9 ---- ios/raw_sound.podspec | 2 +- 12 files changed, 13 insertions(+), 60 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 02a6175..496b00c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -31,7 +31,7 @@ android { 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..9063271 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() @@ -52,7 +50,6 @@ class RawSoundPlayer { do { try session.setCategory(.playback, mode: .default) } catch { - logger.error("\(error.localizedDescription)") return nil } @@ -82,7 +79,6 @@ class RawSoundPlayer { playerNode, to: audioEngine.outputNode, format: outputFormat) audioEngine.prepare() buffers.reserveCapacity(buffersCacheSize) - logger.info("initialized") } func release() -> Bool { @@ -104,27 +100,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 +135,7 @@ class RawSoundPlayer { buffer, completionCallbackType: .dataConsumed, completionHandler: { _ in - // self.logger.debug("--> completionHandler") self.semBufferUsed.signal() - // self.logger.debug("<-- completionHandler") } ) } @@ -163,13 +151,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 +162,6 @@ class RawSoundPlayer { func pause() -> Bool { guard audioEngine.isRunning else { - logger.error("audio engine is not running") return false } if playerNode.isPlaying { @@ -189,7 +173,6 @@ class RawSoundPlayer { func resume() -> Bool { guard audioEngine.isRunning else { - logger.error("audio engine is not running") return false } if !playerNode.isPlaying { @@ -201,22 +184,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 +214,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 +269,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 +284,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..aea7bcb 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)") @@ -64,8 +57,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 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' } From a65716060791b9409adcbb1c6fcd9959112e0e21 Mon Sep 17 00:00:00 2001 From: Hennie Date: Sat, 4 Feb 2023 09:10:34 +0200 Subject: [PATCH 2/8] Add option to toggle the iOS audio session behavior --- ios/Classes/RawSoundPlayer.swift | 14 ++++++++------ ios/Classes/RawSoundPlugin.swift | 4 +++- lib/raw_sound_platform.dart | 3 +++ lib/raw_sound_player.dart | 4 +++- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/ios/Classes/RawSoundPlayer.swift b/ios/Classes/RawSoundPlayer.swift index 9063271..9a84b86 100644 --- a/ios/Classes/RawSoundPlayer.swift +++ b/ios/Classes/RawSoundPlayer.swift @@ -41,16 +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 { - 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) diff --git a/ios/Classes/RawSoundPlugin.swift b/ios/Classes/RawSoundPlugin.swift index aea7bcb..c805e2a 100644 --- a/ios/Classes/RawSoundPlugin.swift +++ b/ios/Classes/RawSoundPlugin.swift @@ -41,9 +41,11 @@ 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, result: result, + configureAudioSession: configureAudioSession,) case "release": release(playerNo: playerNo, result: result) case "play": 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; From 96d148d381a9f8c4406cb26fc5d01e8372e29427 Mon Sep 17 00:00:00 2001 From: Hennie Date: Sat, 4 Feb 2023 09:13:42 +0200 Subject: [PATCH 3/8] Fix broken build --- ios/Classes/RawSoundPlugin.swift | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ios/Classes/RawSoundPlugin.swift b/ios/Classes/RawSoundPlugin.swift index c805e2a..9a07b7c 100644 --- a/ios/Classes/RawSoundPlugin.swift +++ b/ios/Classes/RawSoundPlugin.swift @@ -44,8 +44,9 @@ public class RawSoundPlugin: NSObject, FlutterPlugin { let configureAudioSession = args["configureAudioSession"] as! Bool initialize( bufferSize: bufferSize, sampleRate: sampleRate, - nChannels: nChannels, pcmType: pcmType, result: result, - configureAudioSession: configureAudioSession,) + nChannels: nChannels, pcmType: pcmType, configureAudioSession: configureAudioSession, + result: result, + ) case "release": release(playerNo: playerNo, result: result) case "play": @@ -84,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) From bdb215f19e503846fa3a311fb9ab4d3e332583c6 Mon Sep 17 00:00:00 2001 From: Hennie Date: Sat, 4 Feb 2023 09:15:31 +0200 Subject: [PATCH 4/8] Remove unexpected separator --- ios/Classes/RawSoundPlugin.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/Classes/RawSoundPlugin.swift b/ios/Classes/RawSoundPlugin.swift index 9a07b7c..415955d 100644 --- a/ios/Classes/RawSoundPlugin.swift +++ b/ios/Classes/RawSoundPlugin.swift @@ -45,7 +45,7 @@ public class RawSoundPlugin: NSObject, FlutterPlugin { initialize( bufferSize: bufferSize, sampleRate: sampleRate, nChannels: nChannels, pcmType: pcmType, configureAudioSession: configureAudioSession, - result: result, + result: result ) case "release": release(playerNo: playerNo, result: result) From eb93a97370a4558cfde9682b8245b9e4e37ae0c4 Mon Sep 17 00:00:00 2001 From: Hennie Date: Tue, 23 May 2023 11:07:35 +0200 Subject: [PATCH 5/8] Version update --- CHANGELOG.md | 8 +++++++- pubspec.yaml | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f7dc04..2dd1b18 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 behavior on iOS +* Updates package dependencies + +* ## 0.3.0+1 * Update readme. diff --git a/pubspec.yaml b/pubspec.yaml index d4e3d0b..60eba2a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ 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 @@ -11,8 +11,8 @@ environment: 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: From aadb6c62a671e925c26e0503e27edeb6f445e22a Mon Sep 17 00:00:00 2001 From: Hennie Date: Tue, 23 May 2023 11:08:33 +0200 Subject: [PATCH 6/8] Fix typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dd1b18..8d1c252 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## 0.4.0 * Adds support for older Android and iOS versions -* Adds an option to toggle the audio session behavior on iOS +* Adds an option to toggle the audio session behaviour on iOS * Updates package dependencies * ## 0.3.0+1 From 773452cecde1864f7d81e14e0f1e7d8a0cfcf6ac Mon Sep 17 00:00:00 2001 From: Hennie Date: Tue, 23 May 2023 11:20:58 +0200 Subject: [PATCH 7/8] Update dart sdk version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 60eba2a..6446b2d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ 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: From 269abbaec7d8ba6caf84b998f0fb77db6d841868 Mon Sep 17 00:00:00 2001 From: Hennie Date: Tue, 23 May 2023 13:00:01 +0200 Subject: [PATCH 8/8] Support new Android builds --- android/build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 496b00c..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,7 +25,8 @@ 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'