unityのiosアプリでBluetoothマイクを使いたいが内臓マイクも一緒に使われてしまう

前提

ここに質問の内容を詳しく書いてください。
現在、UnityでiOSで通話する機能を持つアプリを作っています。

実現したいこと

目的としてBlueTooth接続したマイクを使いたいと考えています

発生している問題・エラーメッセージ

そこで以下のようなSwiftコード、mmコードを用意しました
そして
・mmコード→UnityのAsset/Pluginsフォルダに入れて
プラットフォームを「iOS」
Framework dependencesの「CoreFoundation」にチェック
Rarely used frameworksの「CoreAudio」「CoreAudioKit」「CoreBlueTooth」にチェック

・Swiftコード→UnityのAsset/Plugins/iOSフォルダに入れて
Framework dependencesの「CoreFoundation」にチェック
Rarely used frameworksの「CoreAudio」「CoreAudioKit」「CoreBlueTooth」にチェック

この状態でUnityから下記のように呼び出しました 
これで一応Bluetoothマイクが使えるようにはなったのですが、iPhone本体のマイクと接続したBluetoothのマイクの両方から音を拾っています
完全にBluetoothマイク側に入力を切り替えるにはどうしたらいいか解りますでしょうか?

該当のソースコード

swift

import Foundationimport AVFoundation @objc public class SetUpBluetooth : NSObject { @objc public static func Setup() { do { try AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: .allowBluetooth) try AVAudioSession.sharedInstance().setActive(true) } catch {} let availableInputs = AVAudioSession.sharedInstance().availableInputs }}

mm

#import <UnityFramework/UnityFramework-Swift.h> #import <AVFoundation/AVFoundation.h> #ifdef __cplusplus extern "C" { #endif // Bluetoothを有効化する void Setup() { [SetUpBluetooth Setup]; AVAudioSessionRouteDescription *currentRoute = [[AVAudioSession sharedInstance] currentRoute]; // 入出力を取得する NSArray *inputsForRoute = currentRoute.inputs; NSArray *outputsForRoute = currentRoute.outputs; // とりあえず一番最後に繋いだ機材を有効化する AVAudioSessionPortDescription *outPortDesc = [outputsForRoute lastObject]; AVAudioSessionPortDescription *inPortDesc = [inputsForRoute lastObject]; } // Bluetoothマイクの数を返す int MicNum() { AVAudioSessionRouteDescription *currentRoute = [[AVAudioSession sharedInstance] currentRoute]; NSArray *inputsForRoute = currentRoute.inputs; return (int)[inputsForRoute count]; } // Bluetoothスピーカーの数を返す int SpeakerNum() { AVAudioSessionRouteDescription *currentRoute = [[AVAudioSession sharedInstance] currentRoute]; NSArray *outputsForRoute = currentRoute.outputs; return (int)[outputsForRoute count]; } // Bluetoothマイクの名前を返す char* MicName(int index) { AVAudioSessionRouteDescription *currentRoute = [[AVAudioSession sharedInstance] currentRoute]; NSArray *inputsForRoute = currentRoute.inputs; AVAudioSessionPortDescription *portDesc = [inputsForRoute objectAtIndex:index]; // NSString → char* const char *c = (char *)[portDesc.portName UTF8String]; char* retC = (char*)malloc(strlen(c) + 1); strcpy(retC, c); retC[strlen(c)] = '\0'; return retC; } // Bluetoothマイクの種類を返す char* MicType(int index) { AVAudioSessionRouteDescription *currentRoute = [[AVAudioSession sharedInstance] currentRoute]; NSArray *inputsForRoute = currentRoute.inputs; AVAudioSessionPortDescription *portDesc = [inputsForRoute objectAtIndex:index]; // NSString → char* const char *c = (char *)[portDesc.portType UTF8String]; char* retC = (char*)malloc(strlen(c) + 1); strcpy(retC, c); retC[strlen(c)] = '\0'; return retC; } // 指定したBluetoothマイクを有効化する void ActiveMic(int index) { AVAudioSessionRouteDescription *currentRoute = [[AVAudioSession sharedInstance] currentRoute]; NSArray *inputsForRoute = currentRoute.inputs; AVAudioSessionPortDescription *inPortDesc = [inputsForRoute objectAtIndex:index]; } #ifdef __cplusplus } #endif

C#(Unity)

//DLL読むのに必要using System.Runtime.InteropServices; public class VoiceSettingScene : MonoBehaviour { // SetUpBluetooth.mmの関数を宣言する /// <summary> /// Bluetoothを有効化する /// </summary> [DllImport("__Internal")] private static extern void Setup(); /// <summary> /// Bluetoothマイクの数を返す /// </summary> /// <returns></returns> [DllImport("__Internal")] private static extern int MicNum(); /// <summary> /// Bluetoothスピーカーの数を返す /// </summary> /// <returns></returns> [DllImport("__Internal")] private static extern int SpeakerNum(); /// <summary> /// Bluetoothマイクの名前を返す /// </summary> /// <param name="index"></param> /// <returns></returns> [DllImport("__Internal")] private static extern string MicName(int index); /// <summary> /// Bluetoothマイクの種類を返す /// </summary> /// <param name="index"></param> /// <returns></returns> [DllImport("__Internal")] private static extern string MicType(int index); /// <summary> /// Bluetoothマイクを有効化する /// </summary> /// <param name="index"></param> [DllImport("__Internal")] private static extern void ActiveMic(int index); IEnumerator Start() { // Bluetoothを有効化する Setup(); // 接続されているBluetoothマイクがあればBluetoothマイクを接続する if(MicNum() > 0) { ActiveMic(0); } }}

試したこと

Bluetoothマイクをアプリが起動する前から接続
一度アプリを再起動

補足情報(FW/ツールのバージョンなど)

Unity2021.3.9f1
Xcode12.4
iPhoneXs Max(iOS14.3)

コメントを投稿

0 コメント