Exemplo n.º 1
0
//
// 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;
}
Exemplo n.º 2
0
//
// 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;
}
Exemplo n.º 3
0
/*****************************************************************************
 * 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;
}