2013-03-19 4 views
1

Я пытаюсь установить различные частоты дискретизации (например, 32 кГц, 24 кГц и т. Д.) Во входной поток аудиоустройства удаленного ввода-вывода. Но выход всегда воспроизводится при одной из этих частот дискретизации - 22,05 кГц, 33,1 кГц, 11,0 кГц, независимо от того, что я установил. И удивительно, когда я звоню AudioUnitGetProperty на kAudioUnitScope_Output для kAudioUnitProperty_SampleRate, он всегда возвращает 44,1Возможные значения частоты дискретизации в аудио единицах

- (void)startToneUnit 
{ 
    AudioComponentDescription defaultOutputDescription; 
    defaultOutputDescription.componentType = kAudioUnitType_Output; 
    defaultOutputDescription.componentSubType = kAudioUnitSubType_RemoteIO; 
    defaultOutputDescription.componentManufacturer = kAudioUnitManufacturer_Apple; 
    defaultOutputDescription.componentFlags = 0; 
    defaultOutputDescription.componentFlagsMask = 0; 

     // Get the default playback output unit 
    AudioComponent defaultOutput = AudioComponentFindNext(NULL, &defaultOutputDescription); 
    NSAssert(defaultOutput, @"Can't find default output"); 

     // Create a new unit based on this that we'll use for output 
    OSErr err = AudioComponentInstanceNew(defaultOutput, &toneUnit); 
    NSAssert1(toneUnit, @"Error creating unit: %hd", err); 

     // Set our tone rendering function on the unit 
    AURenderCallbackStruct input; 
    input.inputProc = RenderTone; 
    input.inputProcRefCon = (__bridge void *)(self); 
    err = AudioUnitSetProperty(toneUnit, 
           kAudioUnitProperty_SetRenderCallback, 
           kAudioUnitScope_Input, 
           0, 
           &input, 
           sizeof(input)); 
    NSAssert1(err == noErr, @"Error setting callback: %hd", err); 

     // Set the format to 32 bit, single channel, floating point, linear PCM 
    const int four_bytes_per_float = 4; 
    const int eight_bits_per_byte = 8; 

    AudioStreamBasicDescription streamFormat; 
    streamFormat.mSampleRate = SAMPLE_RATE; 
    streamFormat.mFormatID = kAudioFormatLinearPCM; 
    streamFormat.mFormatFlags = 
    kAudioFormatFlagsNativeFloatPacked; 
    streamFormat.mBytesPerPacket = four_bytes_per_float; 
    streamFormat.mFramesPerPacket = 1; 
    streamFormat.mBytesPerFrame = four_bytes_per_float; 
    streamFormat.mChannelsPerFrame = 1; 
    streamFormat.mBitsPerChannel = four_bytes_per_float * eight_bits_per_byte; 
    err = AudioUnitSetProperty (toneUnit, 
           kAudioUnitProperty_StreamFormat, 
           kAudioUnitScope_Input, 
           0, 
           &streamFormat, 
           sizeof(AudioStreamBasicDescription)); 

    NSAssert1(err == noErr, @"Error setting stream format: %hd", err); 

     // Stop changing parameters on the unit 
    err = AudioUnitInitialize(toneUnit); 
    NSAssert1(err == noErr, @"Error initializing unit: %hd", err); 

     // Start playback 
    err = AudioOutputUnitStart(toneUnit); 
    NSAssert1(err == noErr, @"Error starting unit: %hd", err); 

    Float64 outSampleRate = 0.0; 
    UInt32 size = sizeof(Float64); 
    AudioUnitGetProperty (toneUnit, 
          kAudioUnitProperty_SampleRate, 
          kAudioUnitScope_Output, 
          0, 
          &outSampleRate, 
          &size); 
    NSLog(@"Output sample rate is now at %f Hz", outSampleRate); 

    } 

Что поддерживаются все возможные частоты дискретизации вывода для Audio Units? Любая ссылка на документацию от Apple на это будет очень полезно

Благодарности

ответ

3

AudioUnit s, вообще говоря, может работать на любой скорости выборки вы укажете. RemoteIO (или HAL на Mac OS X) AudioUnits, являющиеся фасадами для аппаратного обеспечения, более ограничены - генераторы генераторов с переменной скоростью, генераторы частоты дискретизации, которые могут работать при любой произвольной частоте дискретизации, очень дороги и вообще не подходят для телефонов :)

Различные аппаратные средства iOS, модели оборудования или линии оборудования или модификации могут поддерживать разные частоты дискретизации. RemoteIO просто принимает запрашиваемую вами скорость и устанавливает бортовой конвертер на скорость, которая ближе всего к той, которую вы запрашиваете. Вам всегда нужно сделать AudioUnitGetProperty, чтобы узнать, что вы на самом деле получаете. Если вы хотите записать или работать с другой скоростью, вам необходимо использовать плагин конвертера.

+0

Спасибо !!! Но вызов «AudioUnitGetProperty» для частоты дискретизации всегда возвращает 44,1 кГц, даже если звук воспроизводится на другой частоте, например, 22,05 кГц или 33,1 кГц или 11 кГц (они нашли эти частоты, разделив общие сэмплы, полученные продолжительностью воспроизведения звука). Что-то не так с моим кодом? – srinivas

+1

Деталь --- вы знаете, когда вы устанавливаете свойства ввода RemoteIO, вы должны адресовать их на шину '1', правильно? Когда вы делаете все эти «SetProperty» с помощью «kAudioUnitScope_Input», но «0», они не устанавливают свойства в правильной сущности. – iluvcapra

Смежные вопросы