AVAudioSession, AudioStreamBasicDescription и RemoteIO устройства по подразбиране

В процес съм на опит да напиша приложение, което да обработва цифрови сигнали и искам да го направя възможно най-леко. Едно нещо, което ме объркваше за известно време, беше какви могат да бъдат стойностите по подразбиране за различни устройства, за да мога да избегна нежелано преобразуване, преди да получа данните от буферите. Попаднах на следната връзка http://club15cc.com/code-snippets/ios-2/get-the-default-output-stream-format-for-an-audio-unit-in-ios което ме насочи на това, което вярвам, че е правилният път.

Разширих кода от връзката, за да създам и активирам AVAudioSession, преди да получа съдържанието на ASBD(AudioStreamBasicDescription), след което AudioSession може да се използва за заявяване на различни „Предпочитани“ настройки, за да се види какво въздействие имат. Също така комбинирах кода на Apple за изброяване на стойностите на ASBD с кода от връзката по-горе.

Кодът по-долу се поставя във файла ViewController.m, генериран чрез избиране на шаблона за приложение за единичен изглед. Имайте предвид, че ще трябва да добавите AudioToolbox.framework и CoreAudio.framework към свързаните рамки и библиотеки на проекта.

#import "ViewController.h"
@import AVFoundation;
@import AudioUnit;

@interface ViewController ()

@end

@implementation ViewController

- (void) printASBD:(AudioStreamBasicDescription) asbd {
    char formatIDString[5];
    UInt32 formatID = CFSwapInt32HostToBig (asbd.mFormatID);
    bcopy (&formatID, formatIDString, 4);
    formatIDString[4] = '\0';

    NSLog (@"  Sample Rate:         %10.0f",  asbd.mSampleRate);
    NSLog (@"  Format ID:           %10s",    formatIDString);
    NSLog (@"  Format Flags:        %10X",    (unsigned int)asbd.mFormatFlags);
    NSLog (@"  Bytes per Packet:    %10d",    (unsigned int)asbd.mBytesPerPacket);
    NSLog (@"  Frames per Packet:   %10d",    (unsigned int)asbd.mFramesPerPacket);
    NSLog (@"  Bytes per Frame:     %10d",    (unsigned int)asbd.mBytesPerFrame);
    NSLog (@"  Channels per Frame:  %10d",    (unsigned int)asbd.mChannelsPerFrame);
    NSLog (@"  Bits per Channel:    %10d",    (unsigned int)asbd.mBitsPerChannel);
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSError *error = nil;
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];

    // Get a reference to the AudioSession and activate it
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
    [audioSession setActive:YES error:&error];


    // Then get RemoteIO AudioUnit and use it to get the content of the default AudioStreamBasicDescription
    AudioUnit remoteIOUnit;

    AudioComponentDescription audioComponentDesc = {0};
    audioComponentDesc.componentType = kAudioUnitType_Output;
    audioComponentDesc.componentSubType = kAudioUnitSubType_RemoteIO;
    audioComponentDesc.componentManufacturer = kAudioUnitManufacturer_Apple;

    // Get component
    AudioComponent audioComponent = AudioComponentFindNext(NULL, &audioComponentDesc);
    AudioComponentInstanceNew(audioComponent, &remoteIOUnit);

    // Read the stream format
    size_t asbdSize = sizeof(AudioStreamBasicDescription);
    AudioStreamBasicDescription asbd = {0};
    AudioUnitGetProperty(remoteIOUnit,
                         kAudioUnitProperty_StreamFormat,
                         kAudioUnitScope_Output,
                         0,
                         (void *)&asbd,
                         &asbdSize);

    [self printASBD:asbd];
}

@end

Ще ми е интересно да разбера резултатите, които хората получават за друг действителен хардуер. Обърнете внимание, че кодът е изграден и внедрен в IOS 7.1


person TJA    schedule 22.04.2014    source източник


Отговори (1)


Флаговете за формат са:

kAudioFormatFlagIsFloat                  = (1 << 0),    // 0x1
kAudioFormatFlagIsBigEndian              = (1 << 1),    // 0x2
kAudioFormatFlagIsSignedInteger          = (1 << 2),    // 0x4
kAudioFormatFlagIsPacked                 = (1 << 3),    // 0x8
kAudioFormatFlagIsAlignedHigh            = (1 << 4),    // 0x10
kAudioFormatFlagIsNonInterleaved         = (1 << 5),    // 0x20
kAudioFormatFlagIsNonMixable             = (1 << 6),    // 0x40
kAudioFormatFlagsAreAllClear             = (1 << 31),

Резултатите, които получих за iPad 4 са следните:

Sample Rate:                  0
Format ID:                 lpcm
Format Flags:                29
Bytes per Packet:             4
Frames per Packet:            1
Bytes per Frame:              4
Channels per Frame:           2
Bits per Channel:            32

Предполагам, че lpcm (линейно импулсно кодирана модулация) не беше изненада и флаговете за формат = x'29' kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked заедно с 32 бита на канал изглежда показват очакваните 8.24 "фиксирана плаваща точка".

person TJA    schedule 22.04.2014
comment
Благодаря за пояснението. - person TJA; 31.03.2015
comment
Като погледна още веднъж, мисля, че тук виждате само настройки по подразбиране, независимо от устройството, отразяващи препоръката на kAudioFormatFlagsNativeFloatPacked. Би било интересно да се види дали kAudioFormatFlagIsNonInterleaved всъщност показва дали устройството е стерео или моно. - person Potatoswatter; 31.03.2015