Adds Logger class
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
B500732024D00BAC00BB4475 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = B500731F24D00BAC00BB4475 /* Logger.swift */; };
|
||||
B514657F248E3884005C03F7 /* DispatchReadSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B514657E248E3884005C03F7 /* DispatchReadSource.swift */; };
|
||||
B51FE0C02488F67C00F2A4D2 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51FE0BF2488F67C00F2A4D2 /* Queue.swift */; };
|
||||
B51FE0C22488F96A00F2A4D2 /* QueueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51FE0C12488F96A00F2A4D2 /* QueueTests.swift */; };
|
||||
@@ -71,6 +72,7 @@
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
B500731F24D00BAC00BB4475 /* Logger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = "<group>"; };
|
||||
B514657E248E3884005C03F7 /* DispatchReadSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DispatchReadSource.swift; sourceTree = "<group>"; };
|
||||
B51FE0BF2488F67C00F2A4D2 /* Queue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Queue.swift; sourceTree = "<group>"; };
|
||||
B51FE0C12488F96A00F2A4D2 /* QueueTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueueTests.swift; sourceTree = "<group>"; };
|
||||
@@ -321,6 +323,7 @@
|
||||
B51FE0BF2488F67C00F2A4D2 /* Queue.swift */,
|
||||
B514657E248E3884005C03F7 /* DispatchReadSource.swift */,
|
||||
B59DF1A22493E90C0043C498 /* AudioFileStream+Helpers.swift */,
|
||||
B500731F24D00BAC00BB4475 /* Logger.swift */,
|
||||
);
|
||||
path = Core;
|
||||
sourceTree = "<group>";
|
||||
@@ -509,6 +512,7 @@
|
||||
B5A5FA8B24AE371C00870E2F /* Data+Bytes.swift in Sources */,
|
||||
B55A736C247FCB420050C53D /* HTTPHeaderParser.swift in Sources */,
|
||||
B55CE96E248058B60001C498 /* MetadataParser.swift in Sources */,
|
||||
B500732024D00BAC00BB4475 /* Logger.swift in Sources */,
|
||||
B5276B72247D4D5B00D2F56A /* NetworkTasksMap.swift in Sources */,
|
||||
B5276B74247D4D9F00D2F56A /* NetworkSessionDelegate.swift in Sources */,
|
||||
B55CE97824813BCA0001C498 /* UnsafeMutablePointer+Helpers.swift in Sources */,
|
||||
@@ -680,7 +684,7 @@
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = AudioStreaming/Info.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@@ -690,7 +694,7 @@
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.decimal.AudioStreaming;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTS_MACCATALYST = YES;
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
@@ -709,7 +713,7 @@
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = AudioStreaming/Info.plist;
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
@@ -719,7 +723,7 @@
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.decimal.AudioStreaming;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTS_MACCATALYST = YES;
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
@@ -781,7 +785,7 @@
|
||||
"@executable_path/../Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.decimal.AudioStreamingMac;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SDKROOT = macosx;
|
||||
@@ -806,7 +810,7 @@
|
||||
"@executable_path/../Frameworks",
|
||||
"@loader_path/Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.12;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.decimal.AudioStreamingMac;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SDKROOT = macosx;
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
//
|
||||
// Created by Dimitrios Chatzieleftheriou on 28/07/2020.
|
||||
// Copyright © 2020 Decimal. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import os
|
||||
|
||||
|
||||
private let loggingSubsystem = "audio.streaming.log"
|
||||
|
||||
|
||||
final internal class Logger {
|
||||
private static let audioRendering = OSLog(subsystem: loggingSubsystem, category: "audio.rendering")
|
||||
private static let networking = OSLog(subsystem: loggingSubsystem, category: "audio.networking")
|
||||
private static let generic = OSLog(subsystem: loggingSubsystem, category: "audio.streaming.generic")
|
||||
|
||||
/// Defines is the the logger displays any logs
|
||||
static var isEnabled = true
|
||||
|
||||
enum Category: CaseIterable {
|
||||
case audioRendering
|
||||
case networking
|
||||
case generic
|
||||
|
||||
func toOSLog() -> OSLog {
|
||||
switch self {
|
||||
case .audioRendering: return Logger.audioRendering
|
||||
case .networking: return Logger.networking
|
||||
case .generic: return Logger.generic
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static func error(_ message: StaticString, category: Category, args: CVarArg...) {
|
||||
proccess(message, category: category, type: .error, args: args)
|
||||
}
|
||||
|
||||
static func error(_ message: StaticString, category: Category) {
|
||||
error(message, category: category, args: [])
|
||||
}
|
||||
|
||||
static func debug(_ message: StaticString, category: Category, args: CVarArg...) {
|
||||
proccess(message, category: category, type: .debug, args: args)
|
||||
}
|
||||
|
||||
static func debug(_ message: StaticString, category: Category) {
|
||||
debug(message, category: category, args: [])
|
||||
}
|
||||
|
||||
private static func proccess(_ message: StaticString, category: Category, type: OSLogType, args: CVarArg...) {
|
||||
guard isEnabled else { return }
|
||||
os_log(message, log: category.toOSLog(), type: type, args)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,13 +150,13 @@ extension NetworkDataStream: StreamDelegate {
|
||||
guard let stream = streamState.outputStream, aStream == stream else { return }
|
||||
switch eventCode {
|
||||
case .openCompleted:
|
||||
print("output stream open completed")
|
||||
Logger.debug("output stream open completed", category: .networking)
|
||||
case .hasSpaceAvailable:
|
||||
writeData(on: stream)
|
||||
case .endEncountered:
|
||||
print("end encountered")
|
||||
Logger.debug("output stream end encountered", category: .networking)
|
||||
case .errorOccurred:
|
||||
print("handle error! stop everything right?")
|
||||
Logger.debug("handle error! stop everything right?", category: .networking)
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
@@ -312,11 +312,11 @@ public final class AudioPlayer {
|
||||
|
||||
private func startEngineIfNeeded() throws {
|
||||
guard !isEngineRunning else {
|
||||
print("engine already running")
|
||||
Logger.debug("engine already running 🛵", category: .generic)
|
||||
return
|
||||
}
|
||||
try audioEngine.start()
|
||||
print("engine started 🛵")
|
||||
Logger.debug("engine started 🛵", category: .generic)
|
||||
}
|
||||
|
||||
/// Pauses the audio engine and stops the player's hardware
|
||||
@@ -324,17 +324,17 @@ public final class AudioPlayer {
|
||||
guard isEngineRunning else { return }
|
||||
audioEngine.pause()
|
||||
player?.auAudioUnit.stopHardware()
|
||||
print("engine paused ⏸")
|
||||
Logger.debug("engine paused ⏸", category: .generic)
|
||||
}
|
||||
|
||||
private func stopEngine() {
|
||||
guard isEngineRunning else {
|
||||
print("already already stopped 🛑")
|
||||
Logger.debug("already already stopped 🛑", category: .generic)
|
||||
return
|
||||
}
|
||||
audioEngine.stop()
|
||||
player?.auAudioUnit.stopHardware()
|
||||
print("engine stopped 🛑")
|
||||
Logger.debug("engine stopped 🛑", category: .generic)
|
||||
}
|
||||
|
||||
private func startReadProcessFromSourceIfNeeded() {
|
||||
@@ -380,7 +380,7 @@ public final class AudioPlayer {
|
||||
|
||||
private func setCurrentReading(entry: AudioEntry?, startPlaying: Bool, shouldClearQueue: Bool) {
|
||||
guard let entry = entry else { return }
|
||||
print("Setting current reading entry to: \(entry)")
|
||||
Logger.debug("Setting current reading entry to: %@", category: .generic, args: entry.debugDescription)
|
||||
if startPlaying {
|
||||
let count = Int(rendererContext.bufferTotalFrameCount * rendererContext.bufferFrameSizeInBytes)
|
||||
memset(rendererContext.audioBuffer.mData, 0, count)
|
||||
@@ -482,7 +482,10 @@ public final class AudioPlayer {
|
||||
private func raiseUnxpected(error: AudioPlayerError) {
|
||||
playerContext.internalState = .error
|
||||
// todo raise on main thread from playback thread
|
||||
delegate?.audioPlayerUnexpectedError(player: self, error: error)
|
||||
asyncOnMain { [weak self] in
|
||||
guard let self = self else { return }
|
||||
self.delegate?.audioPlayerUnexpectedError(player: self, error: error)
|
||||
}
|
||||
Logger.error("Error: %@", category: .generic, args: error.localizedDescription)
|
||||
}
|
||||
|
||||
|
||||
@@ -229,7 +229,7 @@ extension RemoteAudioSource: StreamDelegate {
|
||||
public func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
|
||||
switch eventCode {
|
||||
case .openCompleted:
|
||||
print("input stream open completed")
|
||||
Logger.debug("input stream open completed", category: .networking)
|
||||
case .hasBytesAvailable:
|
||||
if httpStatusCode == 0 {
|
||||
if self.parseResponseHeader(response: httpResponse) {
|
||||
|
||||
Reference in New Issue
Block a user