2012-12-01 29 views
6

Tôi đang cố viết ứng dụng iOS sẽ chuyển âm thanh nhận được từ micrô sang loa mà không có bất kỳ thay đổi nào. Tôi đã đọc tài liệu và hướng dẫn của apple. Tôi đã chọn mẫu đầu tiên từ số guide này. Nhưng không có gì xảy ra - im lặng. Như bạn có thể thấy tôi đã cố gắng sử dụng AUAudioGraph (nhận xét) - cùng một kết quả (tôi có cần nó trong ví dụ đơn giản này không?).iOS AudioUnits vượt qua

Tôi đã thấy một số ví dụ trên internet nơi các cuộc gọi lại được sử dụng, nhưng tôi không muốn sử dụng bất kỳ ví dụ nào. Có thể không?

Mọi đề xuất? Cảm ơn sự quan tâm.

Mã thực tế

#import "AudioController.h" 
#import <AudioToolbox/AudioToolbox.h> 
#import <AVFoundation/AVFoundation.h> 
#import <AudioToolbox/AudioServices.h> 
#define kInputBus 1 
#define kOutputBus 0 

@interface AudioController() 
{ 
    AudioComponentDescription desc; 
    AudioComponent component; 
    AudioUnit unit; 
    AudioStreamBasicDescription audioFormat; 
    double rate; 
    //AUGraph graph; 
} 


@end 

@implementation AudioController 

- (void) setUp { 
    AVAudioSession *sess = [AVAudioSession sharedInstance]; 
    NSError *error = nil; 
    rate = 44100.0; 
    [sess setPreferredSampleRate:rate error:&error]; 
    [sess setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]; 
    [sess setActive:YES error:&error]; 
    rate = [sess sampleRate]; 
    if (error) { 
     NSLog(@"%@", error); 
    } 

    NSLog(@"Init..."); 
    [self createUnitDesc]; 
    [self getComponent]; 
    [self getAudioUnit]; 
    [self enableIORec]; 
    [self enableIOPb]; 
    [self createFormat]; 
    [self applyFormat]; 
    OSStatus err = AudioUnitInitialize(unit); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
    /*NewAUGraph(&graph); 
    AUNode node; 
    AUGraphAddNode(graph, &desc, &node); 
AUGraphInitialize(graph); 
AUGraphOpen(graph);*/ 
} 

- (void) createUnitDesc { 
    desc.componentType = kAudioUnitType_Output; 
    desc.componentSubType = kAudioUnitSubType_RemoteIO; 
    desc.componentFlags = 0; 
    desc.componentFlagsMask = 0; 
    desc.componentManufacturer = kAudioUnitManufacturer_Apple; 

} 

- (void) getComponent { 
    component = AudioComponentFindNext(NULL, &desc); 
} 

- (void) getAudioUnit { 
    OSStatus res = AudioComponentInstanceNew(component, &unit); 
    if (noErr != res) { 
     [self showStatus:res]; 
    } 
} 

- (void) enableIORec { 
    UInt32 flag = 1; 
    OSStatus err = AudioUnitSetProperty(unit, 
            kAudioOutputUnitProperty_EnableIO, 
            kAudioUnitScope_Input, 
            kInputBus, 
            &flag, 
            sizeof(flag)); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void) enableIOPb { 
    UInt32 flag = 1; 
    OSStatus err = AudioUnitSetProperty(unit, 
            kAudioOutputUnitProperty_EnableIO, 
            kAudioUnitScope_Output, 
            kOutputBus, 
            &flag, 
            sizeof(flag)); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void) createFormat { 
    // Describe format 
    audioFormat.mSampleRate   = rate;//44100.00; 
    audioFormat.mFormatID   = kAudioFormatLinearPCM; 
    audioFormat.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
    audioFormat.mFramesPerPacket = 1; 
    audioFormat.mChannelsPerFrame = 1; 
    audioFormat.mBitsPerChannel  = 16; 
    audioFormat.mBytesPerPacket  = 2; 
    audioFormat.mBytesPerFrame  = 2; 
} 

- (void) applyFormat { 
    OSStatus err = AudioUnitSetProperty(unit, 
            kAudioUnitProperty_StreamFormat, 
            kAudioUnitScope_Output, 
            kInputBus, 
            &audioFormat, 
            sizeof(audioFormat)); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void) start { 
    NSLog(@"starting"); 
    OSStatus err = AudioOutputUnitStart(unit); 
    //AUGraphStart(graph); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void) end { 
    NSLog(@"ending"); 
    OSStatus err = AudioOutputUnitStop(unit); 
    //AUGraphStop(graph); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void) showStatus:(OSStatus) st{ 
    NSString *text = nil; 
    switch (st) { 
     case kAudioUnitErr_CannotDoInCurrentContext: text = @"kAudioUnitErr_CannotDoInCurrentContext"; break; 
     case kAudioUnitErr_FailedInitialization: text = @"kAudioUnitErr_FailedInitialization"; break; 
     case kAudioUnitErr_FileNotSpecified: text = @"kAudioUnitErr_FileNotSpecified"; break; 
     case kAudioUnitErr_FormatNotSupported: text = @"kAudioUnitErr_FormatNotSupported"; break; 
     case kAudioUnitErr_IllegalInstrument: text = @"kAudioUnitErr_IllegalInstrument"; break; 
     case kAudioUnitErr_Initialized: text = @"kAudioUnitErr_Initialized"; break; 
     case kAudioUnitErr_InstrumentTypeNotFound: text = @"kAudioUnitErr_InstrumentTypeNotFound"; break; 
     case kAudioUnitErr_InvalidElement: text = @"kAudioUnitErr_InvalidElement"; break; 
     case kAudioUnitErr_InvalidFile: text = @"kAudioUnitErr_InvalidFile"; break; 
     case kAudioUnitErr_InvalidOfflineRender: text = @"kAudioUnitErr_InvalidOfflineRender"; break; 
     case kAudioUnitErr_InvalidParameter: text = @"kAudioUnitErr_InvalidParameter"; break; 
     case kAudioUnitErr_InvalidProperty: text = @"kAudioUnitErr_InvalidProperty"; break; 
     case kAudioUnitErr_InvalidPropertyValue: text = @"kAudioUnitErr_InvalidPropertyValue"; break; 
     case kAudioUnitErr_InvalidScope: text = @"kAudioUnitErr_InvalidScope"; break; 
     case kAudioUnitErr_NoConnection: text = @"kAudioUnitErr_NoConnection"; break; 
     case kAudioUnitErr_PropertyNotInUse: text = @"kAudioUnitErr_PropertyNotInUse"; break; 
     case kAudioUnitErr_PropertyNotWritable: text = @"kAudioUnitErr_PropertyNotWritable"; break; 
     case kAudioUnitErr_TooManyFramesToProcess: text = @"kAudioUnitErr_TooManyFramesToProcess"; break; 
     case kAudioUnitErr_Unauthorized: text = @"kAudioUnitErr_Unauthorized"; break; 
     case kAudioUnitErr_Uninitialized: text = @"kAudioUnitErr_Uninitialized"; break; 
     case kAudioUnitErr_UnknownFileType: text = @"kAudioUnitErr_UnknownFileType"; break; 
     default: text = @"unknown error"; 
    } 
    NSLog(@"TRANSLATED_ERROR = %li = %@", st, text); 
} 

- (void) dealloc { 
    AudioUnitUninitialize(unit); 

    [super dealloc]; 
} 

@end 
+2

Có vẻ như bạn đang làm mọi thứ khá chính xác. Tuy nhiên, tôi không thấy bạn đang thực sự kết nối phần tử đầu ra của phạm vi đầu vào với phần tử đầu vào của phạm vi đầu ra. Thiết bị RemoteIO đặc biệt ở chỗ nó xử lý cả đầu vào và đầu ra phần cứng, nhưng chúng không được kết nối hoàn toàn khi thiết bị được khởi tạo. – warrenm

+0

hmmm, bạn có thể vui lòng cho tôi một gợi ý làm thế nào tôi có thể đạt được nó? Bạn đang nói về AUAudioGraph? hoặc có cách nào khác để tạo ra một phần tử kết nối betweeen? Cảm ơn bạn. –

+0

Cảm ơn, đã thực hiện với AudioUnitConnection conn; conn.destInputNumber = 0; conn.sourceAudioUnit = unit; conn.sourceOutputNumber = 1; err = AudioUnitSetProperty (đơn vị, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, 0, & conn, sizeof (conn)); nếu (noErr! = Err) { [tự hiển thịStatus: err]; } –

Trả lời

10

Như warrenm nói thiết lập một kết nối giữa các yếu tố IO từ xa giúp đỡ. Vì vậy, các mã có được đặt sau khi tất cả khởi thực hiện:

AudioUnitConnection conn; 
conn.destInputNumber = kOutputBus; 
conn.sourceAudioUnit = unit; 
conn.sourceOutputNumber = kInputBus; 
err = AudioUnitSetProperty(unit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, kOutputBus, &conn, sizeof(conn)); 
if (noErr != err) { [self showStatus:err]; } 

CẬP NHẬT Để làm cho nó dễ dàng để người khác sử dụng giải pháp tôi sẽ gửi mã đầy đủ ở đây:

File .h

#import <Foundation/Foundation.h> 

@interface AudioController : NSObject 

- (void)setUp; 
- (void)start; 
- (void)end; 
@end 

Tệp .m

#import "AudioController.h" 
#import <AudioToolbox/AudioToolbox.h> 
#import <AVFoundation/AVFoundation.h> 
#import <AudioToolbox/AudioServices.h> 
#define kInputBus 1 
#define kOutputBus 0 

@interface AudioController() 
{ 
    AudioComponentDescription desc; 
    AudioComponent component; 
    AudioUnit unit; 
    AudioStreamBasicDescription audioFormat; 
    double rate; 
} 
@end 

@implementation AudioController 

- (void)setUp 
{ 
    AVAudioSession *sess = [AVAudioSession sharedInstance]; 
    NSError *error = nil; 
    rate = 44100.0; 
    [sess setPreferredSampleRate:rate error:&error]; 
    [sess setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]; 
    [sess setActive:YES error:&error]; 
    rate = [sess sampleRate]; 
    if (error) { 
     NSLog(@"%@", error); 
    } 

    NSLog(@"Initing"); 
    [self createUnitDesc]; 
    [self getComponent]; 
    [self getAudioUnit]; 
    [self enableIORec]; 
    [self enableIOPb]; 
    [self createFormat]; 
    [self applyFormat]; 
    OSStatus err = AudioUnitInitialize(unit); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 

    AudioUnitConnection conn; 
    conn.destInputNumber = 0; 
    conn.sourceAudioUnit = unit; 
    conn.sourceOutputNumber = 1; 
    err = AudioUnitSetProperty(unit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, 0, &conn, sizeof(conn)); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void)createUnitDesc 
{ 
    desc.componentType = kAudioUnitType_Output; 
    desc.componentSubType = kAudioUnitSubType_RemoteIO; 
    desc.componentFlags = 0; 
    desc.componentFlagsMask = 0; 
    desc.componentManufacturer = kAudioUnitManufacturer_Apple; 

} 

- (void)getComponent 
{ 
    component = AudioComponentFindNext(NULL, &desc); 
} 

- (void)getAudioUnit 
{ 
    OSStatus res = AudioComponentInstanceNew(component, &unit); 
    if (noErr != res) { 
     [self showStatus:res]; 
    } 
} 

- (void)enableIORec 
{ 
    UInt32 flag = 1; 
    OSStatus err = AudioUnitSetProperty(unit, 
            kAudioOutputUnitProperty_EnableIO, 
            kAudioUnitScope_Input, 
            kInputBus, 
            &flag, 
            sizeof(flag)); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void)enableIOPb 
{ 
    UInt32 flag = 1; 
    OSStatus err = AudioUnitSetProperty(unit, 
            kAudioOutputUnitProperty_EnableIO, 
            kAudioUnitScope_Output, 
            kOutputBus, 
            &flag, 
            sizeof(flag)); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void)createFormat 
{ 
    // Describe format 
    audioFormat.mSampleRate   = rate; 
    audioFormat.mFormatID   = kAudioFormatLinearPCM; 
    audioFormat.mFormatFlags  = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; 
    audioFormat.mFramesPerPacket = 1; 
    audioFormat.mChannelsPerFrame = 1; 
    audioFormat.mBitsPerChannel  = 16; 
    audioFormat.mBytesPerPacket  = 2; 
    audioFormat.mBytesPerFrame  = 2; 
} 

- (void)applyFormat 
{ 
    OSStatus err = AudioUnitSetProperty(unit, 
            kAudioUnitProperty_StreamFormat, 
            kAudioUnitScope_Output, 
            kInputBus, 
            &audioFormat, 
            sizeof(audioFormat)); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void)start 
{ 
    NSLog(@"starting"); 
    OSStatus err = AudioOutputUnitStart(unit); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void)end 
{ 
    NSLog(@"ending"); 
    OSStatus err = AudioOutputUnitStop(unit); 
    if (noErr != err) { 
     [self showStatus:err]; 
    } 
} 

- (void)showStatus:(OSStatus)st 
{ 
    NSString *text = nil; 
    switch (st) { 
     case kAudioUnitErr_CannotDoInCurrentContext: text = @"kAudioUnitErr_CannotDoInCurrentContext"; break; 
     case kAudioUnitErr_FailedInitialization: text = @"kAudioUnitErr_FailedInitialization"; break; 
     case kAudioUnitErr_FileNotSpecified: text = @"kAudioUnitErr_FileNotSpecified"; break; 
     case kAudioUnitErr_FormatNotSupported: text = @"kAudioUnitErr_FormatNotSupported"; break; 
     case kAudioUnitErr_IllegalInstrument: text = @"kAudioUnitErr_IllegalInstrument"; break; 
     case kAudioUnitErr_Initialized: text = @"kAudioUnitErr_Initialized"; break; 
     case kAudioUnitErr_InstrumentTypeNotFound: text = @"kAudioUnitErr_InstrumentTypeNotFound"; break; 
     case kAudioUnitErr_InvalidElement: text = @"kAudioUnitErr_InvalidElement"; break; 
     case kAudioUnitErr_InvalidFile: text = @"kAudioUnitErr_InvalidFile"; break; 
     case kAudioUnitErr_InvalidOfflineRender: text = @"kAudioUnitErr_InvalidOfflineRender"; break; 
     case kAudioUnitErr_InvalidParameter: text = @"kAudioUnitErr_InvalidParameter"; break; 
     case kAudioUnitErr_InvalidProperty: text = @"kAudioUnitErr_InvalidProperty"; break; 
     case kAudioUnitErr_InvalidPropertyValue: text = @"kAudioUnitErr_InvalidPropertyValue"; break; 
     case kAudioUnitErr_InvalidScope: text = @"kAudioUnitErr_InvalidScope"; break; 
     case kAudioUnitErr_NoConnection: text = @"kAudioUnitErr_NoConnection"; break; 
     case kAudioUnitErr_PropertyNotInUse: text = @"kAudioUnitErr_PropertyNotInUse"; break; 
     case kAudioUnitErr_PropertyNotWritable: text = @"kAudioUnitErr_PropertyNotWritable"; break; 
     case kAudioUnitErr_TooManyFramesToProcess: text = @"kAudioUnitErr_TooManyFramesToProcess"; break; 
     case kAudioUnitErr_Unauthorized: text = @"kAudioUnitErr_Unauthorized"; break; 
     case kAudioUnitErr_Uninitialized: text = @"kAudioUnitErr_Uninitialized"; break; 
     case kAudioUnitErr_UnknownFileType: text = @"kAudioUnitErr_UnknownFileType"; break; 
     default: text = @"unknown error"; 
    } 
    NSLog(@"TRANSLATED_ERROR = %li = %@", st, text); 
} 

- (void)dealloc 
{ 
    AudioUnitUninitialize(unit); 

    [super dealloc]; 
} 

@end 
+0

Bạn có thể vui lòng giải thích cách bạn làm cho nó hoạt động không? Tôi không thể làm cho nó hoạt động – Srikanth

+2

@ Srikanth, hãy xem mã tôi đã đăng. Trước tiên, bạn cần phải tạo một đối tượng 'AudioController', sau đó gọi' setUp' và sau đó điều khiển phát lại bằng cách gọi phương thức 'start' và' end'. –

+1

@Srikanth tạo hai nút cụ thể là bắt đầu và dừng và sau đó cho đầu ra nút khởi động, hãy gọi phương thức khởi động và cho nút tắt của nút dừng, hãy gọi phương thức kết thúc. Hi vọng điêu nay co ich. – madLokesh

Các vấn đề liên quan