Недавно я снова заинтересовался сгенерированным звуком, но у меня есть немного проблем. Я следовал этому учебному пособию и преобразовал его в 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
Программируем под IOS
-
Anonymous
1744280830
Anonymous
Недавно я снова заинтересовался сгенерированным звуком, но у меня есть немного проблем. Я следовал этому учебному пособию и преобразовал его в Swift:
https://gist.github.com/gcatlin/0dd61f19d40804173d015c01a80461b8 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, но я не могу найти рабочий пример того, как это сделать, только некоторые (по общему признанию) частичные примеры о том, как наладить вещи, которые на самом деле не выполняют ни одного тона.>
Подробнее здесь: [url]https://stackoverflow.com/questions/79566144/how-do-you-properly-use-coreaudio-render-callbacks-in-swift[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия