Skip to content

Commit

Permalink
Merge pull request #12 from diatrevolo/feature/add-nondestructive-vol…
Browse files Browse the repository at this point in the history
…ume-and-panning

Feature/add nondestructive volume and panning
  • Loading branch information
diatrevolo authored Jul 16, 2020
2 parents 1555174 + c2fc856 commit 9b42b5c
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 2 deletions.
4 changes: 2 additions & 2 deletions Chassis.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 0.31b;
MARKETING_VERSION = 0.4;
PRODUCT_BUNDLE_IDENTIFIER = com.rawbirdtoe.Chassis;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
Expand Down Expand Up @@ -392,7 +392,7 @@
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 0.31b;
MARKETING_VERSION = 0.4;
PRODUCT_BUNDLE_IDENTIFIER = com.rawbirdtoe.Chassis;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
Expand Down
94 changes: 94 additions & 0 deletions Chassis/AudioEngine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ public protocol EngineConnectable: class {
func bounceScene(filename: String) -> URL?
func convertFile(filepath: URL,
to format: CommonFormats) -> URL?
func changeVolume(to value: Float, track: Track)
func changePan(to value: Float, track: Track)
func getVolume(for track: Track) -> Float
func getPan(for track:Track) -> Float
}

// swiftlint:disable type_body_length
Expand Down Expand Up @@ -844,6 +848,96 @@ public class AudioEngine: EngineConnectable {
}
}
}

public func changeVolume(to value: Float, track: Track) {
if let token = track.token {
let selectedNode = tokenizedFiles[token]?.node
selectedNode?.volume = value
} else {
guard let file = try? loadTrack(track) else { fatalError("Track is not valid.") }
let sampleRate = engine.outputNode.outputFormat(forBus: 0).sampleRate
let audioTime = AVAudioTime(sampleTime: Int64(getMixLength() *
(track.startTime ?? 0) * sampleRate),
atRate: sampleRate)

let matchingTracks = legacyFiles.filter {
$0.url == file.url && $1 == audioTime
}.enumerated()

for trackCandidate in matchingTracks {
let selectedNode = legacyNodes[trackCandidate.offset]
selectedNode.volume = value
}
}
}

public func changePan(to value: Float, track: Track) {
if let token = track.token {
let selectedNode = tokenizedFiles[token]?.node
selectedNode?.pan = value
} else {
guard let file = try? loadTrack(track) else { fatalError("Track is not valid.") }
let sampleRate = engine.outputNode.outputFormat(forBus: 0).sampleRate
let audioTime = AVAudioTime(sampleTime: Int64(getMixLength() *
(track.startTime ?? 0) * sampleRate),
atRate: sampleRate)

let matchingTracks = legacyFiles.filter {
$0.url == file.url && $1 == audioTime
}.enumerated()

for trackCandidate in matchingTracks {
let selectedNode = legacyNodes[trackCandidate.offset]
selectedNode.pan = value
}
}
}

public func getVolume(for track: Track) -> Float {
if let token = track.token {
let selectedNode = tokenizedFiles[token]?.node
return selectedNode?.volume ?? 0.0
} else {
guard let file = try? loadTrack(track) else { fatalError("Track is not valid.") }
let sampleRate = engine.outputNode.outputFormat(forBus: 0).sampleRate
let audioTime = AVAudioTime(sampleTime: Int64(getMixLength() *
(track.startTime ?? 0) * sampleRate),
atRate: sampleRate)

let matchingTracks = legacyFiles.filter {
$0.url == file.url && $1 == audioTime
}.enumerated()

for trackCandidate in matchingTracks {
let selectedNode = legacyNodes[trackCandidate.offset]
return selectedNode.volume
}
}
return 1.0
}

public func getPan(for track: Track) -> Float {
if let token = track.token {
let selectedNode = tokenizedFiles[token]?.node
return selectedNode?.pan ?? 0.5
} else {
guard let file = try? loadTrack(track) else { fatalError("Track is not valid.") }
let sampleRate = engine.outputNode.outputFormat(forBus: 0).sampleRate
let audioTime = AVAudioTime(sampleTime: Int64(getMixLength() *
(track.startTime ?? 0) * sampleRate),
atRate: sampleRate)

let matchingTracks = legacyFiles.filter {
$0.url == file.url && $1 == audioTime
}.enumerated()

for trackCandidate in matchingTracks {
let selectedNode = legacyNodes[trackCandidate.offset]
return selectedNode.pan
}
}
return 0.0
}
}

public typealias BitRate = UInt32
Expand Down

0 comments on commit 9b42b5c

Please sign in to comment.