2

リモート I/O オーディオ ユニットの入力ストリームに異なるサンプリング レート (32kHz、24kHz など) を設定しようとしています。しかし、出力は常に、設定に関係なく、22.05kHz、33.1kHz、11.0kHz のいずれかのサンプリング レートで再生されます。そして驚いたことに、 を呼び出すと AudioUnitGetPropertykAudioUnitScope_Output常にkAudioUnitProperty_SampleRate44.1kHz が返されます。

- (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のドキュメントへの参照は非常に役立ちます

ありがとう

4

1 に答える 1

5

AudioUnits は、一般に、指定したサンプル レートで実行できます。ハードウェアのRemoteIOファサードである (または Mac OS X の HAL) AudioUnits は、より制限されています。可変速度クロック ジェネレーター、任意のサンプル レートで実行できるサンプル レート ジェネレーターは非常に高価であり、一般的に電話には適していません :)

異なる iOS ハードウェア、ハードウェアのモデル、またはハードウェアのラインまたはリビジョンは、異なるサンプル レートをサポートする場合があります。 RemoteIO要求されたレートを受け入れるだけで、要求に最も近いレートにオンボード コンバータが設定されます。AudioUnitGetProperty実際に何が得られているかを確認するには、常に aを実行する必要があります。別のレートで録音または作業する場合は、コンバーター プラグインを使用する必要があります。

于 2013-03-19T18:47:01.230 に答える