2014-02-17 56 views
9

我想使用AVAudioSessionCategoryMultiRoute,但不幸的是,在蘋果開發中心和Google上都沒有例子。 如何使用/實現AVAudioSessionCategoryMultiRoute爲了定義iPhone上的2個不同的路線ios7.0.4? 我的目標是通過揚聲器和耳機路由音頻。 (我知道這是在過去是不可能的,但我想嘗試與ios7)如何在iPhone設備上使用AVAudioSessionCategoryMultiRoute?

感謝你的幫助,

回答

2

這幫助我:AVAudioEngine and Multiroute,這:Audio Session and Multiroute Audio in iOS

就我而言,我使用兩種方法來實現:

第一,要求MultiRoute類別

[_session setCategory:AVAudioSessionCategoryMultiRoute error:nil]; 

方法一:設置AVAudioPlayer的channelAssignments:

// My hardware has 4 output channels 
    if (_outputPortChannels.count == 4) { 
     AVAudioSessionChannelDescription *desiredChannel1 = [_outputPortChannels objectAtIndex:2]; 
     AVAudioSessionChannelDescription *desiredChannel2 = [_outputPortChannels objectAtIndex:3]; 

     // Create an array of desired channels 
     NSArray *channelDescriptions = [NSArray arrayWithObjects:desiredChannel1, desiredChannel2, nil]; 

     // Assign the channels 
     _avAudioPlayer1.channelAssignments = channelDescriptions; 

     NSLog(@"_player.channelAssignments: %@", _avAudioPlayer1.channelAssignments); 

     // Play audio to output channel3, channel4 
     [_avAudioPlayer1 play]; 
    } 

方法2:自定義頻道地圖

// Get channel map indices based on user specified channelNames 
    NSMutableArray *channelMapIndices = [self getOutputChannelMapIndices:_inChannelNames]; 

    NSAssert(channelMapIndices && channelMapIndices.count > 0, @"Error getting indices for user specified channel names!"); 

    // AVAudioEngine setup 
    _engine = [[AVAudioEngine alloc] init]; 
    _output = _engine.outputNode; 
    _mixer = _engine.mainMixerNode; 
    _player = [[AVAudioPlayerNode alloc] init]; 
    [_engine attachNode:_player]; 

    // open the file to play 
    NSString *path1 = [[NSBundle mainBundle] pathForResource:@"yujian" ofType:@"mp3"]; 
    NSURL *songURL1 = [NSURL fileURLWithPath:path1]; 
    _songFile = [[AVAudioFile alloc] initForReading:songURL1 error:nil]; 

    // create output channel map 
    SInt32 source1NumChannels = (SInt32)_songFile.processingFormat.channelCount; 

    // I use constant map 
    // Play audio to output channel3, channel4 
    SInt32 outputChannelMap[4] = {-1, -1, 0, 1}; 

    // This will play audio to output channel1, channel2 
    //SInt32 outputChannelMap[4] = {0, 1, -1, -1}; 

    // set channel map on outputNode AU 
    UInt32 propSize = (UInt32)sizeof(outputChannelMap); 
    OSStatus err = AudioUnitSetProperty(_output.audioUnit, kAudioOutputUnitProperty_ChannelMap, kAudioUnitScope_Global, 1, outputChannelMap, propSize); 
    NSAssert(noErr == err, @"Error setting channel map! %d", (int)err); 

    // make connections 
    AVAudioChannelLayout *channel1Layout = [[AVAudioChannelLayout alloc] initWithLayoutTag:kAudioChannelLayoutTag_DiscreteInOrder | (UInt32)source1NumChannels]; 
    AVAudioFormat *format1 = [[AVAudioFormat alloc] initWithStreamDescription:_songFile.processingFormat.streamDescription channelLayout:channel1Layout]; 
    [_engine connect:_player to:_mixer format:format1]; 
    [_engine connect:_mixer to:_output format:format1]; 

    // schedule the file on player 
    [_player scheduleFile:_songFile atTime:nil completionHandler:nil]; 

    // start engine and player 
    if (!_engine.isRunning) { 
     [_engine startAndReturnError:nil]; 
    } 

    [_player play]; 

它適合我。

+0

您如何爲輸入製作頻道地圖?如果我有外部USB麥克風輸入,並且想從通道5讀取,該怎麼辦?似乎只有kAudioOutputUnitProperty_ChannelMap和沒有kAudioInputUnitProperty_ChannelMap – jaybers

相關問題