// // Server registration, called on REGSVR32.EXE "the dllname.dll" // HRESULT _stdcall DllRegisterServer() { LONG rc; char errstr[128]; rc = RegisterAsioDriver (IID_ASIO_DRIVER,"ASIOSample.dll","ASIO Sample Driver","ASIO Sample","Apartment"); if (rc) { memset(errstr,0,128); sprintf(errstr,"Register Server failed ! (%d)",rc); MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"ASIO sample Driver",MB_OK); return -1; } return S_OK; }
// // Server registration, called on REGSVR32.EXE "the dllname.dll" // HRESULT _declspec(dllexport) DllRegisterServer() { LONG rc; char errstr[128]; rc = RegisterAsioDriver (IID_ASIO_DRIVER[0],"kxasio.dll","kX ASIO Driver","kX ASIO","Apartment"); rc = RegisterAsioDriver (IID_ASIO_DRIVER[1],"kxasio.dll","kX ASIO Driver 1","kX ASIO 1","Apartment"); rc = RegisterAsioDriver (IID_ASIO_DRIVER[2],"kxasio.dll","kX ASIO Driver 2","kX ASIO 2","Apartment"); rc = RegisterAsioDriver (IID_ASIO_DRIVER[3],"kxasio.dll","kX ASIO Driver 3","kX ASIO 3","Apartment"); rc = RegisterAsioDriver (IID_ASIO_DRIVER[4],"kxasio.dll","kX ASIO Driver 4","kX ASIO 4","Apartment"); rc = RegisterAsioDriver (IID_ASIO_DRIVER[5],"kxasio.dll","kX ASIO Driver 5","kX ASIO 5","Apartment"); rc = RegisterAsioDriver (IID_ASIO_DRIVER[6],"kxasio.dll","kX ASIO Driver 6","kX ASIO 6","Apartment"); rc = RegisterAsioDriver (IID_ASIO_DRIVER[7],"kxasio.dll","kX ASIO Driver 7","kX ASIO 7","Apartment"); if(rc) { sprintf(errstr,"Register Server failed ! (%d)",rc); MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"kX ASIO Driver",MB_OK|MB_ICONSTOP); debug("kxasio: register failed: error 0x%x\n",rc); return -1; } return S_OK; }
/***************************************************************************** * RegisterServer() ***************************************************************************** */ HRESULT RegisterServer ( IN LPTSTR TargetSymbolicLink ) { _DbgPrintF(DEBUGLVL_VERBOSE,("[RegisterServer]")); HRESULT hr = E_FAIL; TCHAR ModuleFileName[MAX_PATH]; if (GetModuleFileName(hDllInstance, ModuleFileName, MAX_PATH)) { LPTSTR DriverName = ModuleFileName; CKsEnumerator * KsEnumerator = new CKsEnumerator(&hr); if (KsEnumerator) { if (SUCCEEDED(hr)) { GUID Categories[] = { STATIC_KSCATEGORY_AUDIO, STATIC_KSCATEGORY_RENDER, STATIC_KSCATEGORY_CAPTURE }; hr = KsEnumerator->EnumerateFilters ( KS_TECHNOLOGY_TYPE_AUDIO_RENDER, Categories, SIZEOF_ARRAY(Categories), TRUE, FALSE, TRUE ); if (SUCCEEDED(hr)) { CKsFilter * KsFilter; LISTPOS ListPos = KsEnumerator->m_ListFilters.GetHeadPosition(); _DbgPrintF(DEBUGLVL_VERBOSE,("[RegisterServer] - ksenumerator found : hr= 0x%x", hr)); while (KsEnumerator->m_ListFilters.GetNext(ListPos, &KsFilter)) { LPTSTR SymbolicLink; KsFilter->GetSymbolicLink(&SymbolicLink); if ((TargetSymbolicLink == NULL) || (!_tcsicmp(TargetSymbolicLink, SymbolicLink))) { LPTSTR FriendlyName; KsFilter->GetFriendlyName(&FriendlyName); _DbgPrintF(DEBUGLVL_VERBOSE,("[RegisterServer] - %s", FriendlyName)); // Instantiate the render & capture filter for this symbolic link. HRESULT hr; CKsAudioRenderFilter * KsAudioRenderFilter = new CKsAudioRenderFilter(SymbolicLink, FriendlyName, &hr); if (SUCCEEDED(hr)) { hr = KsAudioRenderFilter->Instantiate(); if (SUCCEEDED(hr)) { hr = KsAudioRenderFilter->EnumeratePins(); } if (SUCCEEDED(hr)) { CKsAudioCaptureFilter * KsAudioCaptureFilter = new CKsAudioCaptureFilter(SymbolicLink, FriendlyName, &hr); if (SUCCEEDED(hr)) { hr = KsAudioCaptureFilter->Instantiate(); if (SUCCEEDED(hr)) { hr = KsAudioCaptureFilter->EnumeratePins(); } if (SUCCEEDED(hr)) { GUID ClassId = LookupClassId(SymbolicLink); // Check the pin caps to see if the filter is capable of the following // bit depths and register an ASIO driver. WAVEFORMATEX WaveFormatEx; WaveFormatEx.wFormatTag = WAVE_FORMAT_PCM; UCHAR BitDepthMask = 0; USHORT BitDepth[] = { 8, 16, 24, 32 }; for (ULONG i=1; i<SIZEOF_ARRAY(BitDepth); i++) { WaveFormatEx.wBitsPerSample = BitDepth[i]; if ((KsAudioRenderFilter->FindViablePin(&WaveFormatEx, KS_FORMAT_MATCHING_CRITERIA_BIT_DEPTH)) && (KsAudioCaptureFilter->FindViablePin(&WaveFormatEx, KS_FORMAT_MATCHING_CRITERIA_BIT_DEPTH))) { BitDepthMask |= 1<<i; } } UCHAR RateMask = 0; ULONG Rates[] = { 44100, 48000, 88200, 96000, 176400, 192000 }; for (ULONG i=0; i<SIZEOF_ARRAY(Rates); i++) { WaveFormatEx.nSamplesPerSec = Rates[i]; if ((KsAudioRenderFilter->FindViablePin(&WaveFormatEx, KS_FORMAT_MATCHING_CRITERIA_FREQUENCY)) && (KsAudioCaptureFilter->FindViablePin(&WaveFormatEx, KS_FORMAT_MATCHING_CRITERIA_FREQUENCY))) { RateMask |= 1<<i; } } if (BitDepthMask) { // Stuff the bit depth & rate in the CLSID. ClassId.Data1 &= 0xFFFFFF00; ClassId.Data1 |= BitDepthMask; ClassId.Data1 &= 0xFFFF00FF; ClassId.Data1 |= USHORT(RateMask)<<8; // Add the ASIO prefix to the friendly name. TCHAR AsioFriendlyName[MAX_PATH]; _stprintf(AsioFriendlyName, "ASIO %s", FriendlyName); ULONG Index = LookupFriendlyNames(AsioFriendlyName); if (Index > 1) { _stprintf(AsioFriendlyName, "ASIO %s (%d)", FriendlyName, Index); } RegisterAsioDriver(AsioFriendlyName, ClassId, DriverName, SymbolicLink); } } delete KsAudioCaptureFilter; } } delete KsAudioRenderFilter; } } } } } delete KsEnumerator; } } return hr; }