2012-05-29 6 views
5

Znajduję przykład prostej aplikacji play-thru za pomocą wbudowanego mikrofonu/głośnika z podtypem kAudioUnitSubType_VoiceProcessingIO podtypu (nie kAudioUnitSubType_HALOutput) w macosx. Komentarze na temat interfejsu API dla rdzeni mówią, że kAudioUnitSubType_VoiceProcessingIO jest dostępny na pulpicie oraz z iPhone 3.0 lub nowszym, więc myślę, że musi być gdzieś przykład dla macos.Jak używać podtypu "kAudioUnitSubType_VoiceProcessingIO" podstawowego interfejsu audio API w systemie Mac OS?

Czy masz pojęcie, gdzie jest próbka? lub Czy jest ktoś, kto wie, jak używać podtypu kAudioUnitSubType_VoiceProcessingIO w macos? Próbowałem już tak samo jak w iOS, ale nie działało.

Odpowiedz

5

Odkryłem kilka rzeczy umożliwiających tę jednostkę IO.

  1. Format strumienia jest naprawdę wybredny. Musi być
    • LinearPCM
    • FlagsCononical
    • 32 bitów kanału
    • (I tak 1 kanał ale może pracować z więcej) -
    • próbkowania 44100 (może współpracować z innymi, nie może)
  2. Nie ustawiono dla niego opcji EnableIO. IO jest domyślnie włączone i ta właściwość nie jest zapisywalna.
  3. Skonfiguruj format strumienia przed inicjalizacją.

Podobnie jak w przypadku innych podstawowych czynności dźwiękowych, wystarczy sprawdzić stan błędu każdego pojedynczego wywołania funkcji, ustalić, jakie są błędy i wprowadzić niewielkie zmiany w każdym kroku, aż w końcu uda się go uruchomić.

+0

Dzięki, działa również z innymi wskaźnikami próbkowania (używam 16 000). Format FlagsCanonical oznacza w systemie MAC OS X Float32 zakres od -1.0 do 1.0. – sarsonj

+0

@sarsonj: Czy jesteś pewien, że możesz sprawić, by działał z częstotliwością próbkowania inną niż domyślna 44100? Dostaję kAudioUnitErr_FormatNotSupported podczas próby ustawienia 16000 lub 48000. – Erfan

+0

Używam jednego kanału, 16000 z kAudioFormatFlagsCanonical na Macu i działa dobrze. – sarsonj

2

Posiadałem dwie różne konfiguracje kAudioUnitProperty_StreamFormat na podstawie liczby kanałów.

size_t bytesPerSample = sizeof (AudioUnitSampleType); 
stereoStreamFormat.mFormatID   = kAudioFormatLinearPCM; 
stereoStreamFormat.mFormatFlags  = kAudioFormatFlagsAudioUnitCanonical; 
stereoStreamFormat.mBytesPerPacket = bytesPerSample; 
stereoStreamFormat.mFramesPerPacket = 1; 
stereoStreamFormat.mBytesPerFrame  = bytesPerSample; 
stereoStreamFormat.mChannelsPerFrame = 2; 
stereoStreamFormat.mBitsPerChannel = 8 * bytesPerSample; 
stereoStreamFormat.mSampleRate  = graphSampleRate; 

i

size_t bytesPerSample = sizeof (AudioUnitSampleType); 
monoStreamFormat.mFormatID   = kAudioFormatLinearPCM; 
monoStreamFormat.mFormatFlags  = kAudioFormatFlagsAudioUnitCanonical; 
monoStreamFormat.mBytesPerPacket = bytesPerSample; 
monoStreamFormat.mFramesPerPacket = 1; 
monoStreamFormat.mBytesPerFrame  = bytesPerSample; 
monoStreamFormat.mChannelsPerFrame = 1;     // 1 indicates mono 
monoStreamFormat.mBitsPerChannel = 8 * bytesPerSample; 
monoStreamFormat.mSampleRate  = graphSampleRate; 

z tych formatów audio strumienia podczas korzystania z urządzenia I/O jako kAudioUnitSubType_VoiceProcessingIO

AudioComponentDescription iOUnitDescription; 
iOUnitDescription.componentType = kAudioUnitType_Output; 
iOUnitDescription.componentSubType = kAudioUnitSubType_VoiceProcessingIO; 
iOUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple; 
iOUnitDescription.componentFlags = 0; 
iOUnitDescription.componentFlagsMask = 0; 

mogę wyraźnie zobaczyć na przerwanie wyjścia audio, jak rozmiar bufora był mniejszy niż rozmiar z tej AudioUnit.

Przełączanie na kAudioUnitSubType_RemoteIO

iOUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;

Ta przerwa znika.

Przetwarzam wejście audio z mikrofonu i wykonuję obliczenia w czasie rzeczywistym na buforach audio.

W metodach graphSampleRate jest częstotliwość próbkowania AVSession

graphSampleRate = [AVAudioSession sharedInstance] sampleRate]; 

a może tu się mylę.

Na koniec wartości parametrów konfiguracyjnych są następujące:

Format strumienia stereo:

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

Format strumień mono:

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

Dzięki SO post here zdałem sobie sprawę, że powinienem użyłem tej flagi:

audioFormat.mFormatFlags  = kAudioFormatFlagsCanonical; 
Powiązane problemy