В процес съм на опит да напиша приложение, което да обработва цифрови сигнали и искам да го направя възможно най-леко. Едно нещо, което ме объркваше за известно време, беше какви могат да бъдат стойностите по подразбиране за различни устройства, за да мога да избегна нежелано преобразуване, преди да получа данните от буферите. Попаднах на следната връзка 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