Skip to content

Commit

Permalink
Refactor AudioNode.swift
Browse files Browse the repository at this point in the history
  • Loading branch information
shogo4405 committed Apr 6, 2024
1 parent 111056a commit faf54e4
Show file tree
Hide file tree
Showing 3 changed files with 180 additions and 158 deletions.
4 changes: 0 additions & 4 deletions HaishinKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@
2EC97B7227880FF400D8BE32 /* OnTapGestureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC97B6E27880FF400D8BE32 /* OnTapGestureView.swift */; };
2EC97B7327880FF400D8BE32 /* Views.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC97B6F27880FF400D8BE32 /* Views.swift */; };
2EC97B7427880FF400D8BE32 /* MTHKSwiftUiView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC97B7027880FF400D8BE32 /* MTHKSwiftUiView.swift */; };
B3016D252B98FF9A0043DB39 /* AudioNode+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3016D242B98FF9A0043DB39 /* AudioNode+Extension.swift */; };
B34239852B9FD3E30068C3FB /* AudioNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B34239842B9FD3E30068C3FB /* AudioNode.swift */; };
B3D687822B80302B00E6A28E /* IOAudioMixer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3D687812B80302B00E6A28E /* IOAudioMixer.swift */; };
BC0394562AA8A384006EDE38 /* Logboard.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC34DFD125EBB12C005F975A /* Logboard.xcframework */; };
Expand Down Expand Up @@ -580,7 +579,6 @@
2EC97B6E27880FF400D8BE32 /* OnTapGestureView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnTapGestureView.swift; sourceTree = "<group>"; };
2EC97B6F27880FF400D8BE32 /* Views.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Views.swift; sourceTree = "<group>"; };
2EC97B7027880FF400D8BE32 /* MTHKSwiftUiView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MTHKSwiftUiView.swift; sourceTree = "<group>"; };
B3016D242B98FF9A0043DB39 /* AudioNode+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AudioNode+Extension.swift"; sourceTree = "<group>"; };
B34239842B9FD3E30068C3FB /* AudioNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioNode.swift; sourceTree = "<group>"; };
B3D687812B80302B00E6A28E /* IOAudioMixer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IOAudioMixer.swift; sourceTree = "<group>"; };
BC03945E2AA8AFF5006EDE38 /* ExpressibleByIntegerLiteral+ExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ExpressibleByIntegerLiteral+ExtensionTests.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1168,7 +1166,6 @@
isa = PBXGroup;
children = (
BC4C9EAE23F2E736004A14F2 /* AudioStreamBasicDescription+Extension.swift */,
B3016D242B98FF9A0043DB39 /* AudioNode+Extension.swift */,
BC93792E2ADD76BE001097DB /* AVAudioCompressedBuffer+Extension.swift */,
1A2166D3A449D813866FE9D9 /* AVAudioFormat+Extension.swift */,
BC22EEF12AAF5D6300E3406D /* AVAudioPCMBuffer+Extension.swift */,
Expand Down Expand Up @@ -1785,7 +1782,6 @@
BCB9773F2621812800C9A649 /* AVCFormatStream.swift in Sources */,
BC83A4732403D83B006BDE06 /* VTCompressionSession+Extension.swift in Sources */,
BC4914A228DDD33D009E2DF6 /* VTSessionConvertible.swift in Sources */,
B3016D252B98FF9A0043DB39 /* AudioNode+Extension.swift in Sources */,
2915EC4D1D85BB8C00621092 /* RTMPTSocket.swift in Sources */,
BC11023E2917C35B00D48035 /* CVPixelBufferPool+Extension.swift in Sources */,
29C2631C1D0083B50098D4EF /* IOVideoUnit.swift in Sources */,
Expand Down
154 changes: 0 additions & 154 deletions Sources/Extension/AudioNode+Extension.swift

This file was deleted.

180 changes: 180 additions & 0 deletions Sources/IO/AudioNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,186 @@ class AudioNode {
}
}

extension AudioNode: CustomStringConvertible {
var description: String {
var description: [String] = []

for scope in BusScope.allCases {
guard let busCount = try? busCount(scope: scope) else {
description.append("failed to get \(scope.rawValue) bus count")
continue
}
guard busCount > 0 else {
continue
}
var busDescription: [String] = []
for busIndex in 0..<busCount {
guard let asbd = try? format(bus: busIndex, scope: scope) else {
busDescription.append("failed to get \(scope.rawValue) bus format for bus \(busIndex)")
continue
}
if let mixerNode = self as? MixerNode, let volume = try? mixerNode.volume(bus: busIndex, of: scope) {
if scope != .input || scope == .input && (try? mixerNode.isEnabled(bus: busIndex, scope: scope)) ?? false {
busDescription.append("bus: \(busIndex), volume: \(volume), format: \(asbd.verboseDescription)")
}
} else {
busDescription.append("bus: \(busIndex), format: \(asbd.verboseDescription)")
}
}

description.append("\(scope.rawValue) \(busDescription.count)/\(busCount)")
description.append(busDescription.joined(separator: "; "))
}

let parametersList = (try? parameters) ?? []
if !parametersList.isEmpty {
description.append("parameters: ")
for parameter in parametersList {
description.append("\(parameter)")
}
}

return "AudioNode(\(description.joined(separator: "; ")))"
}

private var parameters: [AudioUnitParameter] {
get throws {
var result = [AudioUnitParameter]()
var status: OSStatus = noErr

var parameterListSize: UInt32 = 0
AudioUnitGetPropertyInfo(audioUnit,
kAudioUnitProperty_ParameterList,
kAudioUnitScope_Global,
0,
&parameterListSize,
nil)

let numberOfParameters = Int(parameterListSize) / MemoryLayout<AudioUnitParameterID>.size
let parameterIds = UnsafeMutablePointer<AudioUnitParameterID>.allocate(capacity: numberOfParameters)
defer { parameterIds.deallocate() }

if numberOfParameters > 0 {
status = AudioUnitGetProperty(audioUnit,
kAudioUnitProperty_ParameterList,
kAudioUnitScope_Global,
0,
parameterIds,
&parameterListSize)
guard status == noErr else {
throw AudioNodeError.unableToRetrieveValue(status)
}
}

var info = AudioUnitParameterInfo()
var infoSize = UInt32(MemoryLayout<AudioUnitParameterInfo>.size)

for i in 0..<numberOfParameters {
let id = parameterIds[i]
status = AudioUnitGetProperty(audioUnit,
kAudioUnitProperty_ParameterInfo,
kAudioUnitScope_Global,
id,
&info,
&infoSize)
guard status == noErr else {
throw AudioNodeError.unableToRetrieveValue(status)
}
result.append(AudioUnitParameter(info, id: id))
}

return result
}
}
}

private struct AudioUnitParameter: CustomStringConvertible {
var id: Int
var name: String = ""
var minValue: Float
var maxValue: Float
var defaultValue: Float
var unit: AudioUnitParameterUnit

init(_ info: AudioUnitParameterInfo, id: AudioUnitParameterID) {
self.id = Int(id)
if let cfName = info.cfNameString?.takeUnretainedValue() {
name = String(cfName)
}
minValue = info.minValue
maxValue = info.maxValue
defaultValue = info.defaultValue
unit = info.unit
}

var description: String {
return "\(name), id: \(id), min: \(minValue), max: \(maxValue), default: \(defaultValue), unit: \(unit) \(unitName)"
}

var unitName: String {
switch unit {
case .generic:
return "generic"
case .indexed:
return "indexed"
case .boolean:
return "boolean"
case .percent:
return "percent"
case .seconds:
return "seconds"
case .sampleFrames:
return "sampleFrames"
case .phase:
return "phase"
case .rate:
return "rate"
case .hertz:
return "hertz"
case .cents:
return "cents"
case .relativeSemiTones:
return "relativeSemiTones"
case .midiNoteNumber:
return "midiNoteNumber"
case .midiController:
return "midiController"
case .decibels:
return "decibels"
case .linearGain:
return "linearGain"
case .degrees:
return "degrees"
case .equalPowerCrossfade:
return "equalPowerCrossfade"
case .mixerFaderCurve1:
return "mixerFaderCurve1"
case .pan:
return "pan"
case .meters:
return "meters"
case .absoluteCents:
return "absoluteCents"
case .octaves:
return "octaves"
case .BPM:
return "BPM"
case .beats:
return "beats"
case .milliseconds:
return "milliseconds"
case .ratio:
return "ratio"
case .customUnit:
return "customUnit"
case .midi2Controller:
return "midi2Controller"
default:
return "unknown_\(unit)"
}
}
}

class MixerNode: AudioNode {
private var mixerComponentDescription = AudioComponentDescription(
componentType: kAudioUnitType_Mixer,
Expand Down

0 comments on commit faf54e4

Please sign in to comment.