diff options
| author | Alexander Lantsev <aunsane@gmail.com> | 2015-09-08 20:04:50 +0000 | 
|---|---|---|
| committer | Alexander Lantsev <aunsane@gmail.com> | 2015-09-08 20:04:50 +0000 | 
| commit | 8fca45acc3ac3c103ed47d91b6a875ae22716b0a (patch) | |
| tree | 8d85516c64301c5c5f5fae6f857225600269e6dd /protocols/Tox/src | |
| parent | 6d94f59c1ca4db2ea36ccd3296449b36afce8282 (diff) | |
Tox: moving on MMDeviceAPI. pt 1. Multimedia options
git-svn-id: http://svn.miranda-ng.org/main/trunk@15312 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/Tox/src')
| -rw-r--r-- | protocols/Tox/src/stdafx.h | 5 | ||||
| -rw-r--r-- | protocols/Tox/src/tox_core.cpp | 21 | ||||
| -rw-r--r-- | protocols/Tox/src/tox_options.cpp | 143 | ||||
| -rw-r--r-- | protocols/Tox/src/tox_options.h | 5 | 
4 files changed, 119 insertions, 55 deletions
diff --git a/protocols/Tox/src/stdafx.h b/protocols/Tox/src/stdafx.h index 93c73cdf65..3374130495 100644 --- a/protocols/Tox/src/stdafx.h +++ b/protocols/Tox/src/stdafx.h @@ -7,6 +7,11 @@  #include <commctrl.h>
  #include <mmreg.h>
 +#include <MMDeviceAPI.h>
 +
 +#define EXIT_ON_ERROR(hres) if (FAILED(hres)) { goto Exit; }
 +#define SAFE_RELEASE(punk) if ((punk) != NULL) { (punk)->Release(); (punk) = NULL; }
 +DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14);
  #include <string>
  #include <vector>
 diff --git a/protocols/Tox/src/tox_core.cpp b/protocols/Tox/src/tox_core.cpp index 57281ad340..e2c683d751 100644 --- a/protocols/Tox/src/tox_core.cpp +++ b/protocols/Tox/src/tox_core.cpp @@ -68,15 +68,18 @@ bool CToxProto::InitToxCore()  		// group chats
  		//tox_callback_group_invite(tox, OnGroupChatInvite, this);
  		// a/v
 -		/*toxAv = toxav_new(tox, TOX_MAX_CALLS);
 -		toxav_register_audio_callback(toxAv, OnFriendAudio, this);
 -		toxav_register_callstate_callback(toxAv, OnAvInvite, av_OnInvite, this);
 -		toxav_register_callstate_callback(toxAv, OnAvStart, av_OnStart, this);
 -		toxav_register_callstate_callback(toxAv, OnAvCancel, av_OnCancel, this);
 -		toxav_register_callstate_callback(toxAv, OnAvReject, av_OnReject, this);
 -		toxav_register_callstate_callback(toxAv, OnAvEnd, av_OnEnd, this);
 -		toxav_register_callstate_callback(toxAv, OnAvCallTimeout, av_OnRequestTimeout, this);
 -		toxav_register_callstate_callback(toxAv, OnAvPeerTimeout, av_OnPeerTimeout, this);*/
 +		if (IsWinVerVistaPlus())
 +		{
 +			/*toxAv = toxav_new(tox, TOX_MAX_CALLS);
 +			toxav_register_audio_callback(toxAv, OnFriendAudio, this);
 +			toxav_register_callstate_callback(toxAv, OnAvInvite, av_OnInvite, this);
 +			toxav_register_callstate_callback(toxAv, OnAvStart, av_OnStart, this);
 +			toxav_register_callstate_callback(toxAv, OnAvCancel, av_OnCancel, this);
 +			toxav_register_callstate_callback(toxAv, OnAvReject, av_OnReject, this);
 +			toxav_register_callstate_callback(toxAv, OnAvEnd, av_OnEnd, this);
 +			toxav_register_callstate_callback(toxAv, OnAvCallTimeout, av_OnRequestTimeout, this);
 +			toxav_register_callstate_callback(toxAv, OnAvPeerTimeout, av_OnPeerTimeout, this);*/
 +		}
  		uint8_t data[TOX_ADDRESS_SIZE];
  		tox_self_get_address(tox, data);
 diff --git a/protocols/Tox/src/tox_options.cpp b/protocols/Tox/src/tox_options.cpp index b559cc1f4d..87b9df8ce3 100644 --- a/protocols/Tox/src/tox_options.cpp +++ b/protocols/Tox/src/tox_options.cpp @@ -152,8 +152,8 @@ void CToxOptionsMain::ProfileExport_OnClick(CCtrlButton*)  	ofn.lpstrFilter = filter;
  	ofn.nFilterIndex = 0;
  	ofn.lpstrFile = profilePath;
 -	ofn.lpstrTitle = TranslateT("Save Tox profile");\
 -	ofn.nMaxFile = MAX_PATH;
 +	ofn.lpstrTitle = TranslateT("Save Tox profile"); \
 +		ofn.nMaxFile = MAX_PATH;
  	ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_EXPLORER;
  	ofn.lpstrInitialDir = _T("%HOMEPATH%");
 @@ -192,69 +192,124 @@ CToxOptionsMultimedia::CToxOptionsMultimedia(CToxProto *proto)  {
  }
 -bool CToxOptionsMultimedia::GetDeviceFullName(GUID guid, TCHAR *deviceName, DWORD deviceNameLength)
 +void CToxOptionsMultimedia::EnumDevices(CCtrlCombo &combo, IMMDeviceEnumerator *pEnumerator, EDataFlow dataFlow, const char* setting)
  {
 -	TCHAR registryKey[MAX_PATH];
 -	mir_sntprintf(registryKey, _T("System\\CurrentControlSet\\Control\\MediaCategories\\{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"),
 -		guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
 +	HRESULT hr;
 +	UINT count;
 +	DBVARIANT dbv;
 +	LPWSTR pwszID = NULL,
 +		pwszDefID = NULL;
 +	IMMDevice *pDevice = NULL;
 +	IMMDeviceCollection *pDevices = NULL;
 +	PROPVARIANT varName;
 +	IPropertyStore *pProperties = NULL;
 +
 +	if (!m_proto->getWString(setting, &dbv))
 +	{
 +		int len = mir_wstrlen(dbv.pwszVal) * 2;
 +		pwszDefID = (LPWSTR)CoTaskMemAlloc(len + 1);
 +		mir_wstrncpy(pwszDefID, dbv.pwszVal, len);
 +		db_free(&dbv);
 +	}
 +	else
 +	{
 +		hr = pEnumerator->GetDefaultAudioEndpoint(dataFlow, eConsole, &pDevice);
 +		EXIT_ON_ERROR(hr);
 +		hr = pDevice->GetId(&pwszDefID);
 +		EXIT_ON_ERROR(hr);
 +	}
 -	HKEY hKey;
 -	LONG error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, registryKey, 0, KEY_READ, &hKey);
 -	if (error != ERROR_SUCCESS)
 -		return false;
 +	hr = pEnumerator->EnumAudioEndpoints(dataFlow, DEVICE_STATE_ACTIVE, &pDevices);
 +	EXIT_ON_ERROR(hr);
 +	hr = pDevices->GetCount(&count);
 +	EXIT_ON_ERROR(hr);
 -	error = RegQueryValueEx(hKey, _T("Name"), 0, NULL, (LPBYTE)deviceName, &deviceNameLength);
 -	if (error != ERROR_SUCCESS)
 +	for (UINT i = 0; i < count; i++)
  	{
 -		RegCloseKey(hKey);
 -		return false;
 +		hr = pDevices->Item(i, &pDevice);
 +		EXIT_ON_ERROR(hr);
 +		hr = pDevice->OpenPropertyStore(STGM_READ, &pProperties);
 +		EXIT_ON_ERROR(hr);
 +		PropVariantInit(&varName);
 +		hr = pProperties->GetValue(PKEY_Device_FriendlyName, &varName);
 +		EXIT_ON_ERROR(hr);
 +		hr = pDevice->GetId(&pwszID);
 +		EXIT_ON_ERROR(hr);
 +		combo.InsertString(varName.pwszVal, i, (LPARAM)mir_wstrdup(pwszID));
 +		if (mir_wstrcmpi(pwszID, pwszDefID) == 0)
 +			combo.SetCurSel(i);
 +		CoTaskMemFree(pwszID);
 +		CoTaskMemFree(pwszDefID);
 +		PropVariantClear(&varName);
 +		SAFE_RELEASE(pDevice);
 +		SAFE_RELEASE(pProperties);
  	}
 -	RegCloseKey(hKey);
 -	return true;
 +	SAFE_RELEASE(pDevices);
 +	return;
 +
 +Exit:
 +	CoTaskMemFree(pwszID);
 +	CoTaskMemFree(pwszDefID);
 +	SAFE_RELEASE(pDevices);
 +	SAFE_RELEASE(pDevice);
 +	SAFE_RELEASE(pProperties);
  }
  void CToxOptionsMultimedia::OnInitDialog()
  {
  	CToxDlgBase::OnInitDialog();
 -	DWORD count = 0;
 -	TCHAR deviceName[MAX_PATH];
 -	DWORD deviceNameLength = _countof(deviceName);
 +	IMMDeviceEnumerator *pEnumerator = NULL;
 +	HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);
 +	EXIT_ON_ERROR(hr);
 -	WAVEINCAPS2 wic2;
 -	count = waveInGetNumDevs();
 -	for (DWORD i = 0; i < count; i++)
 -	{
 -		if (!waveInGetDevCaps(i, (LPWAVEINCAPS)&wic2, sizeof(WAVEINCAPS2)))
 -		{
 -			if (!GetDeviceFullName(wic2.NameGuid, deviceName, deviceNameLength))
 -				mir_tstrncpy(deviceName, wic2.szPname, deviceNameLength);
 +	EnumDevices(m_audioInput, pEnumerator, eCapture, "AudioInputDeviceID");
 +	EnumDevices(m_audioOutput, pEnumerator, eRender, "AudioOutputDeviceID");
 +	return;
 -			m_audioInput.InsertString(deviceName, i);
 -		}
 -	}
 -	m_audioInput.SetCurSel(m_proto->getDword("AudioInputDeviceID", 0));
 +Exit:
 +	SAFE_RELEASE(pEnumerator);
 +}
 -	WAVEOUTCAPS2 woc2;
 -	count = waveOutGetNumDevs();
 -	for (DWORD i = 0; i < count; i++)
 +void CToxOptionsMultimedia::OnApply()
 +{
 +	int i = m_audioInput.GetCurSel();
 +	if (i == -1)
 +		m_proto->delSetting("AudioInputDeviceID");
 +	else
  	{
 -		if (!waveOutGetDevCaps(i, (LPWAVEOUTCAPS)&woc2, sizeof(WAVEOUTCAPS2)))
 -		{
 -			if (!GetDeviceFullName(woc2.NameGuid, deviceName, deviceNameLength))
 -				mir_tstrncpy(deviceName, woc2.szPname, deviceNameLength);
 +		wchar_t* data = (wchar_t*)m_audioInput.GetItemData(i);
 +		m_proto->setWString("AudioInputDeviceID", data);
 +	}
 -			m_audioOutput.InsertString(deviceName, i);
 -		}
 +	i = m_audioOutput.GetCurSel();
 +	if (i == -1)
 +		m_proto->delSetting("AudioOutputDeviceID");
 +	else
 +	{
 +		wchar_t* data = (wchar_t*)m_audioOutput.GetItemData(i);
 +		m_proto->setWString("AudioOutputDeviceID", data);
  	}
 -	m_audioOutput.SetCurSel(m_proto->getDword("AudioOutputDeviceID", 0));
  }
 -void CToxOptionsMultimedia::OnApply()
 +void CToxOptionsMultimedia::OnDestroy()
  {
 -	m_proto->setDword("AudioInputDeviceID", m_audioInput.GetCurSel());
 -	m_proto->setDword("AudioOutputDeviceID", m_audioOutput.GetCurSel());
 +	int count = m_audioInput.GetCount();
 +	for (int i = 0; i < count; i++)
 +	{
 +		wchar_t* data = (wchar_t*)m_audioInput.GetItemData(i);
 +		mir_free(data);
 +
 +	}
 +
 +	count = m_audioOutput.GetCount();
 +	for (int i = 0; i < count; i++)
 +	{
 +		wchar_t* data = (wchar_t*)m_audioOutput.GetItemData(i);
 +		mir_free(data);
 +
 +	}
  }
  /////////////////////////////////////////////////////////////////////////////////
 diff --git a/protocols/Tox/src/tox_options.h b/protocols/Tox/src/tox_options.h index 902bc49254..a3550bf454 100644 --- a/protocols/Tox/src/tox_options.h +++ b/protocols/Tox/src/tox_options.h @@ -53,11 +53,12 @@ private:  	CCtrlCombo m_audioInput;
  	CCtrlCombo m_audioOutput;
 -	static bool GetDeviceFullName(GUID guid, TCHAR *deviceName, DWORD deviceNameLength);
 -
  protected:
 +	void EnumDevices(CCtrlCombo &combo, IMMDeviceEnumerator *pEnumerator, EDataFlow dataFlow, const char* setting);
 +
  	void OnInitDialog();
  	void OnApply();
 +	void OnDestroy();
  public:
  	CToxOptionsMultimedia(CToxProto *proto);
  | 
