delegate void callBackFunc(JsVal); extern{ // マイクデバイス一覧取得 void hel_net_get_mic_device_list(async callBackFunc); // 現在使用しているマイクデバイスの取得 JsVal hel_net_get_current_mic_device(); // マイクデバイスの変更 //void hel_net_change_mic_device(async callBackFunc, string); // マイクテスト用発声検知の開始 void hel_start_mic_test_speaking_monitor(async fVoidCallback); // マイクテスト用発声検知の停止 void hel_stop_mic_test_speaking_monitor(async fVoidCallback); } extern console { void log(JsVal);//JsValの中身確認用。ブラウザのコンソールで確認できる } component MicPropertyViewModel{ bool _isFirstEnterRoom; bool _isShowPulldown; bool _isFirstAcquisition; MicPropertyModel _model; MicPropertyView _view; MicQuicklyView _quickView; public MicPropertyViewModel(){ _isFirstEnterRoom = true; _isShowPulldown = false; _isFirstAcquisition = true; _model = new MicPropertyModel(); _view = new MicPropertyView(); _quickView = new MicQuicklyView(); _view.SetShowDontShowAgein(_model.GetDontShowAgainFlag()); hsAddEventListener("ui-open-select-mic-dialog", OpenDialog); hsAddEventListener("ui-set-mic-ui-to-off", SetMicUIToOff); hsAddEventListener("mic-test-speaking", VoiceInputView); } void SetMicUIToOff(string _) { hsCanvasResetToggleDefault("Toggle_Voicechat_Mic_On_Off"); } public void Initialize(){ _view.Initialize(); hel_net_get_mic_device_list(InitMicDeviceCallBack); _isFirstEnterRoom = false; hsCanvasToggleChange("Toggle_Mic_Missing"); } public void Update(){ } public void OnResize(int width, int height){ HS2D size = new HS2D(); size.SetXY(width*5, height*5); _view.ResizeBackImage(size); _quickView.ResizeBackImage(size); } public void OpenDialog(string _){ hel_net_get_mic_device_list(GetMicDeviceListCallBack); } // 初回のAPI通信専用コールバック public void InitMicDeviceCallBack(JsVal micDeviceList){ _model.CreateDeviceList(micDeviceList); // デバイス未検出の場合 if(_model.IsMicDeviceListEmpty() || _model.GetMicPermission() == false){ _view.MicNotFoundView(); // マイク未検出の状態でプルダウンが出ていたらプルダウンを閉じる if(_isShowPulldown){ ShowDevicePullDown("-1"); } }else{ // 初回の選択デバイスチェックはcookieかAPIで取得 if(_isFirstAcquisition && (!hel_isAndroid() || !hel_isLineMiniApp())) { // NOTE: Android版LINEミニアプリでは、デバイスIDが維持されない GetCurrentSelectMicDevice(); } // 初回登録が何らかの形で失敗した場合は初期値を入れる if(_model.GetCurrentMicDeviceIndex() == -1){ _model.SetCurrentMicDeviceID(0); ApplyMicDevice(); } // ワールド入場時の表示がONならダイアログを表示 if (_model.GetDontShowAgainFlag() && (!hel_isAndroid() || !hel_isLineMiniApp())) { // NOTE: Android版LINEミニアプリでは、デバイスIDが維持されない // TypeScript層へ反映 ApplyMicDevice(); } else { _view.MicFoundView(); hel_start_mic_test_speaking_monitor(DummyCallback); } _view.ChangeCurrentMicDeviceName(_model.GetCurrentMicDeviceName()); } } // 使用できるマイクデバイス一覧を取得 public void GetMicDeviceListCallBack(JsVal micDeviceList){ _model.CreateDeviceList(micDeviceList); // デバイス未検出の場合 if(_model.IsMicDeviceListEmpty() || _model.GetMicPermission() == false){ _view.MicNotFoundView(); // マイク未検出の状態でプルダウンが出ていたらプルダウンを閉じる if(_isShowPulldown){ ShowDevicePullDown("-1"); } }else{ _model.SetCurrentMicDeviceID(_model.GetCurrentMicDeviceIndex()); ApplyMicDevice(); _view.ChangeCurrentMicDeviceName(_model.GetCurrentMicDeviceName()); _view.MicFoundView(); } } // 使用できるマイクデバイス一覧を取得 public void ChangeNextMicDeviceListCallBack(JsVal micDeviceList){ _model.CreateDeviceList(micDeviceList); // デバイス未検出の場合 if(_model.IsMicDeviceListEmpty() || _model.GetMicPermission() == false){ _view.MicNotFoundView(); // マイク未検出の状態でプルダウンが出ていたらプルダウンを閉じる if(_isShowPulldown){ ShowDevicePullDown("-1"); } }else{ _view.MicFoundView(); _model.NextMicDevice(); _view.ChangeCurrentMicDeviceName(_model.GetCurrentMicDeviceName()); hsCanvasResetToggleDefault("Toggle_Voicechat_Mic_On_Off"); ApplyMicDevice(); } } // 現在選択しているマイクデバイスをcookieかAPIから取得 // コールバックから呼び出す為public関数 public void GetCurrentSelectMicDevice(){ // cookieにデバイスが選択されていた場合 if(_model.GetMicDeviceIDChache() != ""){ // cookieから現在の選択デバイスを登録 int micDeviceIndex = _model.FindMicDeviceIndexByDeviceID(_model.GetMicDeviceIDChache()); // cookieのデバイスIDが前はあったけど、現在は検出できなかったIDの場合は初期値にする。 if(micDeviceIndex == -1){ micDeviceIndex = 0; // マイク選択ダイアログを再表示 _model.SetDontShowAgainFlag(false); } _model.SetCurrentMicDeviceID(micDeviceIndex); }else{ // 初回チェックでcookie未検出もしくは、初回チェック以外 JsVal currentMicDeviceData = hel_net_get_current_mic_device(); _model.CreateCurrentDevice(currentMicDeviceData); } _isFirstAcquisition = false; } public void OnChangedMicPermissionState(int micPermissionState) { _model.SetMicPermission(micPermissionState == HSMicPermissionState_Granted); if(_isFirstEnterRoom){ Initialize(); } } public void OnNetPosConnected(){ } /// -----Controllerからの操作用処理----- /// レイヤー表示/非表示 public void SetShowLayer(string showFlag){ bool isShow = showFlag == "true"; _view.SetShowLayer(MICPROPERTY_LAYER_NAME, isShow); if(isShow == false){ _view.SetShowLayer(PULLDOWN_LAYER_NAME, isShow); } } /// マイクデバイスのプルダウン生成 public void ShowDevicePullDown(string arg){ if(_isShowPulldown == false){ hel_net_get_mic_device_list(GetMicDeviceListCallBack); _view.CreateDeviceListPullDown(_model.GetMicDeviceNameList(), _model.GetCurrentMicDeviceIndex()); }else{ _view.DeleateDeviceListPullDown(); } hsCanvasResetToggleDefault("Toggle_Voicechat_Mic_On_Off"); _isShowPulldown = !_isShowPulldown; } // 簡易設定のレイヤー展開 public void OpenQuickLayer(string dummyArg){ hel_net_get_mic_device_list(UpdateDeviceList); } void UpdateDeviceList(JsVal micDeviceList) { _model.CreateDeviceList(micDeviceList); _quickView.SetShowPullDownLayer(true); _quickView.CreateDeviceListPullDown(_model.GetMicDeviceNameList(), _model.GetCurrentMicDeviceIndex()); _quickView.ChangePulldownArrow(); } // 簡易設定のレイヤー閉じる public void CloseQuickLayer(string dummyArg){ _quickView.SetShowPullDownLayer(false); _quickView.DeleateDevicePullDown(); _quickView.ChangePulldownArrow(); } /// プルダウンからデバイスを選択した場合 public void OnSelectDevice(string pulldownName){ // constだとstringの関数が使えないので移植 string defautlText = MICPROPERTY_BUTTON_NAME_PULLDOWN_MIC; int indexLength = 0; string micIndex = ""; // 通常のダイアログプルダウンが押された場合 if(pulldownName.IndexOf(MICPROPERTY_BUTTON_NAME_PULLDOWN_MIC) == -1){ // 簡易設定版のボタンが押された場合 defautlText = MICQUICKRY_BUTTON_NAME_PULLDOWN_MIC; } indexLength = pulldownName.Length() - defautlText.Length(); micIndex = pulldownName.SubString(defautlText.Length(), indexLength); // indexからデバイスを登録 _model.SetCurrentMicDeviceID(micIndex.ToInt()); // 簡易設定のトグルを変更しておく _quickView.ChangeMicSelectToggle(micIndex.ToInt()); // UI上の選択デバイス名を変更 _view.ChangeCurrentMicDeviceName(_model.GetCurrentMicDeviceName()); // ApplyMicDevice(); hel_net_set_mic_enabled(false); hsCanvasResetToggleDefault("Toggle_Voicechat_Mic_On_Off"); } /// "次回から表示しない"のチェックボックス public void SetDontShowAgain(string showFlag){ bool isShow = showFlag == "true"; _model.SetDontShowAgainFlag(isShow); _view.SetShowDontShowAgein(isShow); // cookie登録 _model.SetShowAgeinCookie(); } public void ChangeNextMic(string arg){ hel_net_get_mic_device_list(ChangeNextMicDeviceListCallBack); } /// デバイスを登録 public void ApplyMicDevice(){ JsVal applyDeviceID = makeJsStrFrom(_model.GetCurrentMicDeviceID()); hel_net_change_mic_device(OnChangeMicDeviceCallBack, _model.GetCurrentMicDeviceID()); } public void OnChangeMicDeviceCallBack(JsVal responce){ string applyStateus = responce.GetProperty("status").GetStr(); hsCanvasResetToggleDefault("Toggle_Mic_Missing"); // 登録に成功したコールバックを受け付けたら、cookieにも登録 if(applyStateus == "ok"){ _model.SetSelectMicDeviceIDCookie(_model.GetCurrentMicDeviceID()); hsCanvasToggleChange("Toggle_Mic_Missing"); //hsSystemWriteLine("[%s] ChageMic %s" % applyStateus % responce.GetProperty("device_info").GetProperty("label").GetStr()); if (_view.IsShowMicFoundView()) { hel_start_mic_test_speaking_monitor(DummyCallback); } } } public void EnterRoom(){ _view.SetShowLayer(MICPROPERTY_LAYER_NAME, false); _view.SetShowLayer(PULLDOWN_LAYER_NAME, false); } public void StopMicTestSpeakingMonitor() { hel_stop_mic_test_speaking_monitor(DummyCallback); } void VoiceInputView(string paramJson) { JsVal param = makeJsValFromJson(paramJson); _view.VoiceInputView(int(param.GetProperty("inputState").GetNum())); } void DummyCallback() { } }