Как правильно использовать обратные вызовы CoreAudioIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно использовать обратные вызовы CoreAudio

Сообщение Anonymous »

Недавно я снова заинтересовался сгенерированным звуком, но у меня есть немного проблем. Я следовал этому учебному пособию и преобразовал его в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»