#include <winsock2.h>
#include <ws2bth.h>
typedef int (*BthCreateSCOConnectionWrapper)( BT_ADDR*, unsigned short* );
typedef int (*BthCloseConnectionWrapper)( unsigned short );
/* Hidden deep in the WinCE sources, I guess. */
#define WODM_BT_SCO_AUDIO_CONTROL 500
/*
Call this function with the address of a paired headset (use FindBTAudioDevice),
a valid handle from waveOutOpen and you will be given a connection handle.
Returns 0 if successful.
*/
int ConnectWaveOutToBT(BT_ADDR btaddress, /* Bluetooth device address. */
void *btserviceid, /* Unused */
HWAVEOUT hWaveOut, /* Audio device */
unsigned short *connection_handle) /* out parameter */
{
int err = 0;
HMODULE hMod = NULL;
/* Code for creating a SCO connection */
{
BthCreateSCOConnectionWrapper dll_BthCreateSCOConnection;
hMod = GetModuleHandle(L"btdrt.dll");
if ( hMod == NULL )
hMod = LoadLibrary(L"btdrt.dll");
if ( hMod == NULL )
{
err = 1;
goto exit_function;
}
dll_BthCreateSCOConnection = (BthCreateSCOConnectionWrapper)
GetProcAddress(hMod, L"BthCreateSCOConnection");
if ( dll_BthCreateSCOConnection == NULL )
{
err = 1;
goto exit_function;
}
/* Use the address to get a connection. */
dll_BthCreateSCOConnection(&btaddress, connection_handle);
/* Tell the audio device to begin using Bluetooth (I think). */
waveOutMessage(hWaveOut, WODM_BT_SCO_AUDIO_CONTROL, 0, TRUE);
err = 0;
goto exit_function;
}
exit_function:
return err;
}
int DisconnectWaveOutFromBT(HWAVEOUT waveouthandle,
unsigned short connection_handle )
{
int err = 0;
BthCloseConnectionWrapper dll_BthCloseConnection = NULL;
HMODULE hMod = NULL;
/* To close the audio channel,
1. Signal the audio driver to stop routing to the Bluetooth chip;
2. Close the SCO connection.
*/
waveOutMessage(waveouthandle, WODM_BT_SCO_AUDIO_CONTROL, 0, FALSE);
hMod = GetModuleHandle(L"btdrt.dll");
if( hMod == NULL )
{
err = 1;
goto exit_function;
}
dll_BthCloseConnection = (BthCloseConnectionWrapper)
GetProcAddress(hMod, L"BthCloseConnection");
if ( dll_BthCloseConnection == NULL )
{
err = 1;
goto exit_function;
}
dll_BthCloseConnection(connection_handle);
exit_function:
return err;
}
int FindBTAudioDevice(BT_ADDR *device, size_t *devices)
{
HKEY hKey;
size_t i = 0; /* < *devices */
#define AUDIOGATEWAY_DEVICES L"SOFTWARE\\Microsoft\\Bluetooth\\AudioGateway\\Devices"
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, AUDIOGATEWAY_DEVICES, 0, 0, &hKey))
{
DWORD dwIndex = 0;
WCHAR wzSubKey[MAX_PATH];
DWORD dwLen = MAX_PATH;
while (ERROR_NO_MORE_ITEMS !=
RegEnumKeyEx(hKey, dwIndex++, wzSubKey, &dwLen, NULL, NULL, NULL, NULL)
&& i < *devices)
{
HKEY hSubKey;
WCHAR wzValue[MAX_PATH];
StringCchCopy(wzValue, MAX_PATH, AUDIOGATEWAY_DEVICES);
StringCchCat(wzValue, MAX_PATH, L"\\");
StringCchCat(wzValue, MAX_PATH, wzSubKey);
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, wzValue, 0, 0, &hSubKey) )
{
DWORD dwType, dwLen;
BYTE bData[1024];
dwLen = 1024;
if ( ERROR_SUCCESS ==
RegQueryValueEx(hSubKey, L"Address", NULL, &dwType, bData, &dwLen) )
{
if ( dwType == REG_BINARY )
{
memset(&device[i], 0, sizeof(BT_ADDR));
memcpy(&device[i], bData, dwLen);
i++;
}
}
RegCloseKey(hSubKey); /* Keys under AudioGateway\Devices in registry */
}
}
RegCloseKey(hKey); /* AudioGateway\Devices in registry */
}
*devices = i;
return 0;
}
Thursday, August 09, 2007
Bluetooth Audio on WinCE
This is derived from code I found on this blog.
Basically, you do waveInOpen and waveOutOpen and then startup some
special Bluetooth code.
A paired headset's settings are stored in the registry and contains
an address needed by the open connection function.
Subscribe to:
Post Comments (Atom)
1 comment:
I can't seem to get this to work on my i610. This is the only webpage that I have found when searching for dll_BthCreateSCOConnection.
Post a Comment