PageRenderTime 44ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/indra/newview/llpanelvoicedevicesettings.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 329 lines | 235 code | 49 blank | 45 comment | 32 complexity | 6f841034e13a3799388bde345688ae9e MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file llpanelvoicedevicesettings.cpp
  3. * @author Richard Nelson
  4. * @brief Voice communication set-up
  5. *
  6. * $LicenseInfo:firstyear=2007&license=viewerlgpl$
  7. * Second Life Viewer Source Code
  8. * Copyright (C) 2010, Linden Research, Inc.
  9. *
  10. * This library is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU Lesser General Public
  12. * License as published by the Free Software Foundation;
  13. * version 2.1 of the License only.
  14. *
  15. * This library is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18. * Lesser General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU Lesser General Public
  21. * License along with this library; if not, write to the Free Software
  22. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  23. *
  24. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  25. * $/LicenseInfo$
  26. */
  27. #include "llviewerprecompiledheaders.h"
  28. #include "llpanelvoicedevicesettings.h"
  29. // Viewer includes
  30. #include "llcombobox.h"
  31. #include "llsliderctrl.h"
  32. #include "llviewercontrol.h"
  33. #include "llvoiceclient.h"
  34. #include "llvoicechannel.h"
  35. // Library includes (after viewer)
  36. #include "lluictrlfactory.h"
  37. static LLRegisterPanelClassWrapper<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings");
  38. static const std::string DEFAULT_DEVICE("Default");
  39. LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
  40. : LLPanel()
  41. {
  42. mCtrlInputDevices = NULL;
  43. mCtrlOutputDevices = NULL;
  44. mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
  45. mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
  46. mDevicesUpdated = FALSE;
  47. mUseTuningMode = true;
  48. // grab "live" mic volume level
  49. mMicVolume = gSavedSettings.getF32("AudioLevelMic");
  50. }
  51. LLPanelVoiceDeviceSettings::~LLPanelVoiceDeviceSettings()
  52. {
  53. }
  54. BOOL LLPanelVoiceDeviceSettings::postBuild()
  55. {
  56. LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
  57. // set mic volume tuning slider based on last mic volume setting
  58. volume_slider->setValue(mMicVolume);
  59. mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
  60. mCtrlOutputDevices = getChild<LLComboBox>("voice_output_device");
  61. mCtrlInputDevices->setCommitCallback(
  62. boost::bind(&LLPanelVoiceDeviceSettings::onCommitInputDevice, this));
  63. mCtrlOutputDevices->setCommitCallback(
  64. boost::bind(&LLPanelVoiceDeviceSettings::onCommitOutputDevice, this));
  65. mLocalizedDeviceNames[DEFAULT_DEVICE] = getString("default_text");
  66. mLocalizedDeviceNames["No Device"] = getString("name_no_device");
  67. mLocalizedDeviceNames["Default System Device"] = getString("name_default_system_device");
  68. return TRUE;
  69. }
  70. // virtual
  71. void LLPanelVoiceDeviceSettings::handleVisibilityChange ( BOOL new_visibility )
  72. {
  73. if (new_visibility)
  74. {
  75. initialize();
  76. }
  77. else
  78. {
  79. cleanup();
  80. // when closing this window, turn of visiblity control so that
  81. // next time preferences is opened we don't suspend voice
  82. gSavedSettings.setBOOL("ShowDeviceSettings", FALSE);
  83. }
  84. }
  85. void LLPanelVoiceDeviceSettings::draw()
  86. {
  87. refresh();
  88. // let user know that volume indicator is not yet available
  89. bool is_in_tuning_mode = LLVoiceClient::getInstance()->inTuningMode();
  90. getChildView("wait_text")->setVisible( !is_in_tuning_mode && mUseTuningMode);
  91. LLPanel::draw();
  92. if (is_in_tuning_mode)
  93. {
  94. const S32 num_bars = 5;
  95. F32 voice_power = LLVoiceClient::getInstance()->tuningGetEnergy() / LLVoiceClient::OVERDRIVEN_POWER_LEVEL;
  96. S32 discrete_power = llmin(num_bars, llfloor(voice_power * (F32)num_bars + 0.1f));
  97. for(S32 power_bar_idx = 0; power_bar_idx < num_bars; power_bar_idx++)
  98. {
  99. std::string view_name = llformat("%s%d", "bar", power_bar_idx);
  100. LLView* bar_view = getChild<LLView>(view_name);
  101. if (bar_view)
  102. {
  103. gl_rect_2d(bar_view->getRect(), LLColor4::grey, TRUE);
  104. LLColor4 color;
  105. if (power_bar_idx < discrete_power)
  106. {
  107. color = (power_bar_idx >= 3) ? LLUIColorTable::instance().getColor("OverdrivenColor") : LLUIColorTable::instance().getColor("SpeakingColor");
  108. }
  109. else
  110. {
  111. color = LLUIColorTable::instance().getColor("PanelFocusBackgroundColor");
  112. }
  113. LLRect color_rect = bar_view->getRect();
  114. color_rect.stretch(-1);
  115. gl_rect_2d(color_rect, color, TRUE);
  116. }
  117. }
  118. }
  119. }
  120. void LLPanelVoiceDeviceSettings::apply()
  121. {
  122. std::string s;
  123. if(mCtrlInputDevices)
  124. {
  125. s = mCtrlInputDevices->getValue().asString();
  126. gSavedSettings.setString("VoiceInputAudioDevice", s);
  127. mInputDevice = s;
  128. }
  129. if(mCtrlOutputDevices)
  130. {
  131. s = mCtrlOutputDevices->getValue().asString();
  132. gSavedSettings.setString("VoiceOutputAudioDevice", s);
  133. mOutputDevice = s;
  134. }
  135. // assume we are being destroyed by closing our embedding window
  136. LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
  137. if(volume_slider)
  138. {
  139. F32 slider_value = (F32)volume_slider->getValue().asReal();
  140. gSavedSettings.setF32("AudioLevelMic", slider_value);
  141. mMicVolume = slider_value;
  142. }
  143. }
  144. void LLPanelVoiceDeviceSettings::cancel()
  145. {
  146. gSavedSettings.setString("VoiceInputAudioDevice", mInputDevice);
  147. gSavedSettings.setString("VoiceOutputAudioDevice", mOutputDevice);
  148. if(mCtrlInputDevices)
  149. mCtrlInputDevices->setValue(mInputDevice);
  150. if(mCtrlOutputDevices)
  151. mCtrlOutputDevices->setValue(mOutputDevice);
  152. gSavedSettings.setF32("AudioLevelMic", mMicVolume);
  153. LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
  154. if(volume_slider)
  155. {
  156. volume_slider->setValue(mMicVolume);
  157. }
  158. }
  159. void LLPanelVoiceDeviceSettings::refresh()
  160. {
  161. //grab current volume
  162. LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
  163. // set mic volume tuning slider based on last mic volume setting
  164. F32 current_volume = (F32)volume_slider->getValue().asReal();
  165. LLVoiceClient::getInstance()->tuningSetMicVolume(current_volume);
  166. // Fill in popup menus
  167. bool device_settings_available = LLVoiceClient::getInstance()->deviceSettingsAvailable();
  168. if (mCtrlInputDevices)
  169. {
  170. mCtrlInputDevices->setEnabled(device_settings_available);
  171. }
  172. if (mCtrlOutputDevices)
  173. {
  174. mCtrlOutputDevices->setEnabled(device_settings_available);
  175. }
  176. getChild<LLSlider>("mic_volume_slider")->setEnabled(device_settings_available);
  177. if(!device_settings_available)
  178. {
  179. // The combo boxes are disabled, since we can't get the device settings from the daemon just now.
  180. // Put the currently set default (ONLY) in the box, and select it.
  181. if(mCtrlInputDevices)
  182. {
  183. mCtrlInputDevices->removeall();
  184. mCtrlInputDevices->add(getLocalizedDeviceName(mInputDevice), mInputDevice, ADD_BOTTOM);
  185. mCtrlInputDevices->setValue(mInputDevice);
  186. }
  187. if(mCtrlOutputDevices)
  188. {
  189. mCtrlOutputDevices->removeall();
  190. mCtrlOutputDevices->add(getLocalizedDeviceName(mOutputDevice), mOutputDevice, ADD_BOTTOM);
  191. mCtrlOutputDevices->setValue(mOutputDevice);
  192. }
  193. mDevicesUpdated = FALSE;
  194. }
  195. else if (!mDevicesUpdated)
  196. {
  197. LLVoiceDeviceList::const_iterator iter;
  198. if(mCtrlInputDevices)
  199. {
  200. mCtrlInputDevices->removeall();
  201. mCtrlInputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);
  202. for(iter=LLVoiceClient::getInstance()->getCaptureDevices().begin();
  203. iter != LLVoiceClient::getInstance()->getCaptureDevices().end();
  204. iter++)
  205. {
  206. mCtrlInputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);
  207. }
  208. // Fix invalid input audio device preference.
  209. if (!mCtrlInputDevices->setSelectedByValue(mInputDevice, TRUE))
  210. {
  211. mCtrlInputDevices->setValue(DEFAULT_DEVICE);
  212. gSavedSettings.setString("VoiceInputAudioDevice", DEFAULT_DEVICE);
  213. mInputDevice = DEFAULT_DEVICE;
  214. }
  215. }
  216. if(mCtrlOutputDevices)
  217. {
  218. mCtrlOutputDevices->removeall();
  219. mCtrlOutputDevices->add(getLocalizedDeviceName(DEFAULT_DEVICE), DEFAULT_DEVICE, ADD_BOTTOM);
  220. for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin();
  221. iter != LLVoiceClient::getInstance()->getRenderDevices().end(); iter++)
  222. {
  223. mCtrlOutputDevices->add(getLocalizedDeviceName(*iter), *iter, ADD_BOTTOM);
  224. }
  225. // Fix invalid output audio device preference.
  226. if (!mCtrlOutputDevices->setSelectedByValue(mOutputDevice, TRUE))
  227. {
  228. mCtrlOutputDevices->setValue(DEFAULT_DEVICE);
  229. gSavedSettings.setString("VoiceOutputAudioDevice", DEFAULT_DEVICE);
  230. mOutputDevice = DEFAULT_DEVICE;
  231. }
  232. }
  233. mDevicesUpdated = TRUE;
  234. }
  235. }
  236. void LLPanelVoiceDeviceSettings::initialize()
  237. {
  238. mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
  239. mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
  240. mMicVolume = gSavedSettings.getF32("AudioLevelMic");
  241. mDevicesUpdated = FALSE;
  242. // ask for new device enumeration
  243. LLVoiceClient::getInstance()->refreshDeviceLists();
  244. // put voice client in "tuning" mode
  245. if (mUseTuningMode)
  246. {
  247. LLVoiceClient::getInstance()->tuningStart();
  248. LLVoiceChannel::suspend();
  249. }
  250. }
  251. void LLPanelVoiceDeviceSettings::cleanup()
  252. {
  253. if (mUseTuningMode)
  254. {
  255. LLVoiceClient::getInstance()->tuningStop();
  256. LLVoiceChannel::resume();
  257. }
  258. }
  259. // returns English name if no translation found
  260. std::string LLPanelVoiceDeviceSettings::getLocalizedDeviceName(const std::string& en_dev_name)
  261. {
  262. std::map<std::string, std::string>::const_iterator it = mLocalizedDeviceNames.find(en_dev_name);
  263. return it != mLocalizedDeviceNames.end() ? it->second : en_dev_name;
  264. }
  265. void LLPanelVoiceDeviceSettings::onCommitInputDevice()
  266. {
  267. if(LLVoiceClient::getInstance())
  268. {
  269. LLVoiceClient::getInstance()->setCaptureDevice(
  270. mCtrlInputDevices->getValue().asString());
  271. }
  272. }
  273. void LLPanelVoiceDeviceSettings::onCommitOutputDevice()
  274. {
  275. if(LLVoiceClient::getInstance())
  276. {
  277. LLVoiceClient::getInstance()->setRenderDevice(
  278. mCtrlInputDevices->getValue().asString());
  279. }
  280. }