2011-05-09 47 views
15

オーディオ出力をフォーンスピーカーにリダイレクトしても、マイクのヘッドフォン入力を使用することはできますか?オーディオ出力をフォーンスピーカーにリダイレクトし、マイク入力をヘッドフォンにリダイレクト

ヘッドフォンの代わりに電話のスピーカーにオーディオルートをリダイレクトすると、マイクがリダイレクトされます。これは理にかなっていますが、私はちょうどマイク入力をリダイレクトすることができないようですね?何か案は?ここで

は私がスピーカーにオーディオリダイレクトするために使用しているコードです:

UInt32 doChangeDefaultRoute = true;   
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute); 
NSAssert(propertySetError == 0, @"Failed to set audio session property: OverrideCategoryDefaultToSpeaker"); 
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 
+1

あなたはおそらくこれを知っていますが、スピーカーを有効にすると、電話でマイクも有効になります。ただし、iPodでは、スピーカーを有効にすると、ヘッドセットからマイクサウンドを引き出すことができます。 ProbはiPodにマイクがないので意図していません。 私は簡単に、ヘッドフォンやスピーカーの出力からマイクを得るためにios 4.3 sdkアプリを手に入れました。ルート変更後に再びAUGraphを初期化しましたが、間欠的に起こっていましたが、今は全く起こらない(ios 4.3 + xcode 4+) – zeAttle

答えて

4

それはそれが可能だと同じように、私は怖い見ていません。 Audio Session Programming Guideから

- kAudioSessionProperty_OverrideAudioRoute

ヘッドセットはあなたがkAudioSessionOverrideAudioRoute_Speakerに、このプロパティの値 を設定した時刻に電源に接続されている場合、システムは、入力のためだけでなく、出力のルーティング オーディオを変更します。入力が来ます内蔵マイク から、出力は内蔵スピーカーに送られます。

this question

+0

Tommyが[この質問](http://stackoverflow.com/questions/4002133/forcing-iphone-microphone-as-audio-input)で実行したのと同じ手順に従って、利用可能な 'AVCaptureDevice'sを見つける価値があるかもしれません –

6

の可能性の重複これは可能ですが、それはあなたがそれを設定する方法についてうるさいです。

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 

それはAVAudioSessionCategoryPlayAndRecordを使用するか、ルートがスピーカーに行くために失敗しますが非常に重要です。オーディオセッションのオーバーライドルートを設定したら、AVAudioPlayerインスタンスを使用して、スピーカーに出力を送信できます。

それは私のためにやったような他の人のために働くことを望みます。これに関するドキュメントは散在していますが、Skypeアプリではそれが可能であることが証明されています。忍耐、私の友人! :)

ここではいくつかのアップルのドキュメント:http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html

することはあなたが何ができるかkAudioSessionProperty_OverrideAudioRoute

2

ページで検索を行い、いずれの場合にはスピーカーにオーディオ出力を強制することです:UI Hacker - iOS: Force audio output to speakers while headphones are plugged in

から

@interface AudioRouter : NSObject 

+ (void) initAudioSessionRouting; 
+ (void) switchToDefaultHardware; 
+ (void) forceOutputToBuiltInSpeakers; 

@end 

および

#import "AudioRouter.h" 
#import <AudioToolbox/AudioToolbox.h> 
#import <AVFoundation/AVFoundation.h> 

@implementation AudioRouter 

#define IS_DEBUGGING NO 
#define IS_DEBUGGING_EXTRA_INFO NO 

+ (void) initAudioSessionRouting { 

    // Called once to route all audio through speakers, even if something's plugged into the headphone jack 
    static BOOL audioSessionSetup = NO; 
    if (audioSessionSetup == NO) { 

     // set category to accept properties assigned below 
     NSError *sessionError = nil; 
     [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: &sessionError]; 

     // Doubly force audio to come out of speaker 
     UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
     AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 

     // fix issue with audio interrupting video recording - allow audio to mix on top of other media 
     UInt32 doSetProperty = 1; 
     AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty); 

     // set active 
     [[AVAudioSession sharedInstance] setDelegate:self]; 
     [[AVAudioSession sharedInstance] setActive: YES error: nil]; 

     // add listener for audio input changes 
     AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, onAudioRouteChange, nil); 
     AudioSessionAddPropertyListener (kAudioSessionProperty_AudioInputAvailable, onAudioRouteChange, nil); 

    } 

    // Force audio to come out of speaker 
    [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; 


    // set flag 
    audioSessionSetup = YES; 
} 

+ (void) switchToDefaultHardware { 
    // Remove forcing to built-in speaker 
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; 
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 
} 

+ (void) forceOutputToBuiltInSpeakers { 
    // Re-force audio to come out of speaker 
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 


} 

void onAudioRouteChange (void* clientData, AudioSessionPropertyID inID, UInt32 dataSize, const void* inData) { 

    if(IS_DEBUGGING == YES) { 
     NSLog(@"==== Audio Harware Status ===="); 
     NSLog(@"Current Input: %@", [AudioRouter getAudioSessionInput]); 
     NSLog(@"Current Output: %@", [AudioRouter getAudioSessionOutput]); 
     NSLog(@"Current hardware route: %@", [AudioRouter getAudioSessionRoute]); 
     NSLog(@"=============================="); 
    } 

    if(IS_DEBUGGING_EXTRA_INFO == YES) { 
     NSLog(@"==== Audio Harware Status (EXTENDED) ===="); 
     CFDictionaryRef dict = (CFDictionaryRef)inData; 
     CFNumberRef reason = CFDictionaryGetValue(dict, kAudioSession_RouteChangeKey_Reason); 
     CFDictionaryRef oldRoute = CFDictionaryGetValue(dict, kAudioSession_AudioRouteChangeKey_PreviousRouteDescription); 
     CFDictionaryRef newRoute = CFDictionaryGetValue(dict, kAudioSession_AudioRouteChangeKey_CurrentRouteDescription); 
     NSLog(@"Audio old route: %@", oldRoute); 
     NSLog(@"Audio new route: %@", newRoute); 
     NSLog(@"========================================="); 
    } 



} 

+ (NSString*) getAudioSessionInput { 
    UInt32 routeSize; 
    AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &routeSize); 
    CFDictionaryRef desc; // this is the dictionary to contain descriptions 

    // make the call to get the audio description and populate the desc dictionary 
    AudioSessionGetProperty (kAudioSessionProperty_AudioRouteDescription, &routeSize, &desc); 

    // the dictionary contains 2 keys, for input and output. Get output array 
    CFArrayRef outputs = CFDictionaryGetValue(desc, kAudioSession_AudioRouteKey_Inputs); 

    // the output array contains 1 element - a dictionary 
    CFDictionaryRef diction = CFArrayGetValueAtIndex(outputs, 0); 

    // get the output description from the dictionary 
    CFStringRef input = CFDictionaryGetValue(diction, kAudioSession_AudioRouteKey_Type); 
    return [NSString stringWithFormat:@"%@", input]; 
} 

+ (NSString*) getAudioSessionOutput { 
    UInt32 routeSize; 
    AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &routeSize); 
    CFDictionaryRef desc; // this is the dictionary to contain descriptions 

    // make the call to get the audio description and populate the desc dictionary 
    AudioSessionGetProperty (kAudioSessionProperty_AudioRouteDescription, &routeSize, &desc); 

    // the dictionary contains 2 keys, for input and output. Get output array 
    CFArrayRef outputs = CFDictionaryGetValue(desc, kAudioSession_AudioRouteKey_Outputs); 

    // the output array contains 1 element - a dictionary 
    CFDictionaryRef diction = CFArrayGetValueAtIndex(outputs, 0); 

    // get the output description from the dictionary 
    CFStringRef output = CFDictionaryGetValue(diction, kAudioSession_AudioRouteKey_Type); 
    return [NSString stringWithFormat:@"%@", output]; 
} 

+ (NSString*) getAudioSessionRoute { 
    /* 
    returns the current session route: 
    * ReceiverAndMicrophone 
    * HeadsetInOut 
    * Headset 
    * HeadphonesAndMicrophone 
    * Headphone 
    * SpeakerAndMicrophone 
    * Speaker 
    * HeadsetBT 
    * LineInOut 
    * Lineout 
    * Default 
    */ 

    UInt32 rSize = sizeof (CFStringRef); 
    CFStringRef route; 
    AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, &rSize, &route); 

    if (route == NULL) { 
     NSLog(@"Silent switch is currently on"); 
     return @"None"; 
    } 
    return [NSString stringWithFormat:@"%@", route]; 
} 

@end 
関連する問題