Optimize media tracking resource usage

This commit is contained in:
Beingpax 2025-08-29 22:55:58 +05:45
parent 82f3464f5d
commit ff6ef3a601
2 changed files with 50 additions and 10 deletions

View File

@ -15,6 +15,12 @@ class PlaybackController: ObservableObject {
@Published var isPauseMediaEnabled: Bool = UserDefaults.standard.bool(forKey: "isPauseMediaEnabled") {
didSet {
UserDefaults.standard.set(isPauseMediaEnabled, forKey: "isPauseMediaEnabled")
if isPauseMediaEnabled {
startMediaTracking()
} else {
stopMediaTracking()
}
}
}
@ -25,19 +31,40 @@ class PlaybackController: ObservableObject {
UserDefaults.standard.set(false, forKey: "isPauseMediaEnabled")
}
mediaController.startListening()
setupMediaControllerCallbacks()
if isPauseMediaEnabled {
startMediaTracking()
}
}
private func setupMediaControllerCallbacks() {
mediaController.onTrackInfoReceived = { [weak self] trackInfo in
self?.isMediaPlaying = trackInfo.payload.isPlaying ?? false
self?.lastKnownTrackInfo = trackInfo
}
mediaController.onListenerTerminated = {
mediaController.onListenerTerminated = { [weak self] in
guard let self = self, self.isPauseMediaEnabled else { return }
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.mediaController.startListening()
self.startMediaTracking()
}
}
}
private func startMediaTracking() {
mediaController.startListening()
}
private func stopMediaTracking() {
mediaController.stopListening()
isMediaPlaying = false
lastKnownTrackInfo = nil
wasPlayingWhenRecordingStarted = false
originalMediaAppBundleId = nil
}
func pauseMedia() async {
wasPlayingWhenRecordingStarted = false
originalMediaAppBundleId = nil
@ -51,18 +78,25 @@ class PlaybackController: ObservableObject {
wasPlayingWhenRecordingStarted = true
originalMediaAppBundleId = bundleId
// Add a small delay to ensure state is set before sending command
try? await Task.sleep(nanoseconds: 50_000_000)
mediaController.pause()
}
func resumeMedia() async {
let shouldResume = wasPlayingWhenRecordingStarted
let originalBundleId = originalMediaAppBundleId
defer {
wasPlayingWhenRecordingStarted = false
originalMediaAppBundleId = nil
}
guard isPauseMediaEnabled,
wasPlayingWhenRecordingStarted,
let bundleId = originalMediaAppBundleId else {
shouldResume,
let bundleId = originalBundleId else {
return
}
@ -77,6 +111,8 @@ class PlaybackController: ObservableObject {
return
}
try? await Task.sleep(nanoseconds: 50_000_000)
mediaController.play()
}
@ -91,4 +127,5 @@ extension UserDefaults {
get { bool(forKey: "isPauseMediaEnabled") }
set { set(newValue, forKey: "isPauseMediaEnabled") }
}
}
}

View File

@ -77,10 +77,13 @@ class Recorder: NSObject, ObservableObject, AVAudioRecorderDelegate {
hasDetectedAudioInCurrentSession = false
Task {
await playbackController.pauseMedia()
_ = await mediaController.muteSystemAudio()
}
// Coordinate media control and system audio sequentially for better reliability
await playbackController.pauseMedia()
// Small delay to allow media command to process before muting system audio
try? await Task.sleep(nanoseconds: 100_000_000) // 100ms
_ = await mediaController.muteSystemAudio()
let deviceID = deviceManager.getCurrentDevice()
if deviceID != 0 {