Недавно я снова заинтересовался сгенерированным звуком, но у меня есть немного проблем. Я следовал этому учебному пособию и преобразовал его в Swift:
https://gist.github.com/gcatlin/0dd61f1 ... 01a80461b8 br/> Однако, когда я воспроизводил все, а не все, а не чистое, а не чистое, а не чистое, а не чистое, а не чистое, а не чистое. ожидая. Вот код, который я использую для создания тонального блока: < /p>
private func createToneUnit() throws {
// Configure the search parameters to find the default playback output unit
var outputDesc = AudioComponentDescription()
outputDesc.componentType = kAudioUnitType_Output
outputDesc.componentSubType = kAudioUnitSubType_RemoteIO
outputDesc.componentManufacturer = kAudioUnitManufacturer_Apple
outputDesc.componentFlags = 0
outputDesc.componentFlagsMask = 0
// Get the default playback output unit
guard let output = AudioComponentFindNext(nil, &outputDesc) else {
throw AudioError.cannotFindOutput
}
// Create a new unit based on this that we'll use for output
var error = AudioComponentInstanceNew(output, &toneUnit)
guard let toneUnit = toneUnit, error == noErr else {
throw AudioError.cannotCreateComponent
}
// Set our tone rendering function on the unit
var callback = AURenderCallbackStruct()
callback.inputProcRefCon = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque())
callback.inputProc = {
(userData, actionFlags, timeStamp, busNumber, frameCount, data) -> OSStatus in
let _self = Unmanaged.fromOpaque(userData).takeUnretainedValue()
return _self.renderTone(actionFlags: actionFlags, timeStamp: timeStamp, busNumber: busNumber, frameCount: frameCount, data: data)
}
error = AudioUnitSetProperty(
toneUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input,
0,
&callback,
UInt32(MemoryLayout.size(ofValue: callback))
)
guard error == noErr else {
throw AudioError.cannotSetCallback
}
// Set the format to 32 bit, single channel, floating point, linear PCM
var streamFormat = AudioStreamBasicDescription()
streamFormat.mSampleRate = sampleRate
streamFormat.mFormatID = kAudioFormatLinearPCM
streamFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked
streamFormat.mFramesPerPacket = 1
streamFormat.mChannelsPerFrame = 1
streamFormat.mBitsPerChannel = 16
streamFormat.mBytesPerFrame = streamFormat.mChannelsPerFrame * streamFormat.mBitsPerChannel / 8
streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame * streamFormat.mFramesPerPacket
error = AudioUnitSetProperty(
toneUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
0,
&streamFormat,
UInt32(MemoryLayout.size)
)
guard error == noErr else {
throw AudioError.cannotSetStreamFormat
}
}
< /code>
И вот функция рендеринга: < /p>
func renderTone(
actionFlags: UnsafeMutablePointer,
timeStamp: UnsafePointer,
busNumber: UInt32,
frameCount: UInt32,
data: UnsafeMutablePointer?
) -> OSStatus {
// Get buffer
let bufferList = UnsafeMutableAudioBufferListPointer(data!)
let increment = MainViewController.fullCycle * frequency / sampleRate
// Generate samples
for buffer in bufferList {
for frame in 0 ..< frameCount {
if let audioData = buffer.mData?.assumingMemoryBound(to: Float64.self) {
audioData[Int(frame)] = sin(theta) * amplitude
}
// Note: this would NOT work for a stereo output
theta += increment
while theta > MainViewController.fullCycle {
theta -= MainViewController.fullCycle
}
}
}
return noErr;
}
< /code>
Кто -нибудь видит что -то явно плохое в этом? Я бы очень предпочел использовать Swift, чем obj C, но я не могу найти рабочий пример того, как это сделать, только некоторые (по общему признанию) частичные примеры о том, как наладить вещи, которые на самом деле не выполняют ни одного тона.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... s-in-swift
Как правильно использовать обратные вызовы CoreAudio ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение