Установите громкость левого и правого наушников с помощью двух разных ползунков

#ios #swift #xcode #avaudioengine

#iOS #быстрый #xcode — код #avaudioengine

Вопрос:

Я генерирую волновой звук для разных частот, и пользователь должен слышать этот волновой звук только в наушниках, и он / она установит громкость левого и правого наушников с помощью двух разных ползунков. Чтобы добиться волнового звука, я написал ниже код, который работает идеально. Но проблема в том, что последние 5 дней я пытаюсь установить громкость для левого и правого наушников отдельно, но безуспешно.

 class Synth {

// MARK: Properties
public static let shared = Synth()

public var volume: Float {
    set {
        audioEngine.mainMixerNode.outputVolume = newValue
    }
    get {
        audioEngine.mainMixerNode.outputVolume
    }
}

public var frequencyRampValue: Float = 0

public var frequency: Float = 440 {
    didSet {
        if oldValue != 0 {
            frequencyRampValue = frequency - oldValue
        } else {
            frequencyRampValue = 0
        }
    }
}

private var audioEngine: AVAudioEngine

private lazy var sourceNode = AVAudioSourceNode { _, _, frameCount, audioBufferList in
    let ablPointer = UnsafeMutableAudioBufferListPointer(audioBufferList)
            
    let localRampValue = self.frequencyRampValue
    let localFrequency = self.frequency - localRampValue
    
    let period = 1 / localFrequency

    for frame in 0..<Int(frameCount) {
        let percentComplete = self.time / period
        let sampleVal = self.signal(localFrequency   localRampValue * percentComplete, self.time)
        self.time  = self.deltaTime
        self.time = fmod(self.time, period)
        
        for buffer in ablPointer {
            let buf: UnsafeMutableBufferPointer<Float> = UnsafeMutableBufferPointer(buffer)
            buf[frame] = sampleVal
        }
    }
    
    self.frequencyRampValue = 0
    
    return noErr
}

private var time: Float = 0
private let sampleRate: Double
private let deltaTime: Float

private var signal: Signal

// MARK: Init

init(signal: @escaping Signal = Oscillator.square) {
    
    audioEngine = AVAudioEngine()
    let mainMixer = audioEngine.mainMixerNode
    let outputNode = audioEngine.outputNode
    let format = outputNode.inputFormat(forBus: 0)
    
    sampleRate = format.sampleRate
    deltaTime = 1 / Float(sampleRate)
    
    self.signal = signal
    
    let inputFormat = AVAudioFormat(commonFormat: format.commonFormat,
                                    sampleRate: format.sampleRate,
                                    channels: 1,
                                    interleaved: format.isInterleaved)
    
    audioEngine.attach(sourceNode)
    audioEngine.connect(sourceNode, to: mainMixer, format: inputFormat)
    audioEngine.connect(mainMixer, to: outputNode, format: nil)
    mainMixer.outputVolume = 0
    audioEngine.mainMixerNode.pan = 100 // this does not work, 
    //audioEngine.mainMixerNode.pan = 1.0 // this also does not work
    do {
        try audioEngine.start()
    } catch {
        print("Could not start engine: (error.localizedDescription)")
    }
    
}

//This function will be called in view controller to generate sound
public func setWaveformTo(_ signal: @escaping Signal) {
    self.signal = signal
}

}
 

С помощью приведенного выше кода я могу слышать звук волны как обычно в левом и правом наушниках.
Я попытался использовать audioEngine.mainMixerNode.pan для значений 100 и -100, а также -1.0 и 1.0, но это не внесло никаких изменений.

Комментарии:

1. Я нигде не вижу, что вы устанавливаете pan в своем коде. Было бы лучше, если бы ты показал это.

2. Я обновил код, пожалуйста, проверьте. (После инструкций connect)

Ответ №1:

Я попытался использовать audioEngine.mainMixerNode.pan для значений 100 и -100, но это не внесло никаких изменений.

Допустимый диапазон для этого pan значения равен {-1.0, 1.0}. Значения, которые, по вашим словам, вы использовали, находятся за пределами этого диапазона, поэтому неудивительно, что они не оказали никакого эффекта. Попробуйте вместо этого 0,75 или -0,75.

Комментарии:

1. вы называете это как audioEngine.mainMixerNode.pan = -1.0 для левого и audioEngine.mainMixerNode.pan = 1.0 для правого? Пожалуйста, уточните.