Example #1
0
void WASAPISource::InitClient()
{
	CoTaskMemPtr<WAVEFORMATEX> wfex;
	HRESULT                    res;
	DWORD                      flags = AUDCLNT_STREAMFLAGS_EVENTCALLBACK;

	res = device->Activate(__uuidof(IAudioClient), CLSCTX_ALL,
			nullptr, (void**)client.Assign());
	if (FAILED(res))
		throw HRError("Failed to activate client context", res);

	res = client->GetMixFormat(&wfex);
	if (FAILED(res))
		throw HRError("Failed to get mix format", res);

	InitFormat(wfex);

	if (!isInputDevice)
		flags |= AUDCLNT_STREAMFLAGS_LOOPBACK;

	res = client->Initialize(
			AUDCLNT_SHAREMODE_SHARED, flags,
			BUFFER_TIME_100NS, 0, wfex, nullptr);
	if (FAILED(res))
		throw HRError("Failed to get initialize audio client", res);
}
Example #2
0
HRESULT ezUwpApplication::OnActivated(ICoreApplicationView* view, IActivatedEventArgs* args)
{
  view->remove_Activated(m_activateRegistrationToken);

  ActivationKind activationKind;
  EZ_SUCCEED_OR_RETURN(args->get_Kind(&activationKind));

  if (activationKind == ActivationKind_Launch)
  {
    ComPtr<ILaunchActivatedEventArgs> launchArgs;
    EZ_SUCCEED_OR_RETURN(args->QueryInterface(launchArgs.GetAddressOf()));

    HString argHString;
    EZ_SUCCEED_OR_RETURN(launchArgs->get_Arguments(argHString.GetAddressOf()));

    ezDynamicArray<const char*> argv;
    ezCommandLineUtils::SplitCommandLineString(ezStringUtf8(argHString).GetData(), true, m_commandLineArgs, argv);

    m_application->SetCommandLineArguments(argv.GetCount(), argv.GetData());
  }

  // Activate main window together with the application!
  ComPtr<ABI::Windows::UI::Core::ICoreWindow> pCoreWindow;
  EZ_SUCCEED_OR_RETURN(view->get_CoreWindow(pCoreWindow.GetAddressOf()));
  EZ_SUCCEED_OR_RETURN(pCoreWindow->Activate());

  return S_OK;
}
Example #3
0
void WASAPISource::InitRender()
{
	CoTaskMemPtr<WAVEFORMATEX> wfex;
	HRESULT                    res;
	LPBYTE                     buffer;
	UINT32                     frames;
	ComPtr<IAudioClient>       client;

	res = device->Activate(__uuidof(IAudioClient), CLSCTX_ALL,
			nullptr, (void**)client.Assign());
	if (FAILED(res))
		throw HRError("Failed to activate client context", res);

	res = client->GetMixFormat(&wfex);
	if (FAILED(res))
		throw HRError("Failed to get mix format", res);

	res = client->Initialize(
			AUDCLNT_SHAREMODE_SHARED, 0,
			BUFFER_TIME_100NS, 0, wfex, nullptr);
	if (FAILED(res))
		throw HRError("Failed to get initialize audio client", res);

	/* Silent loopback fix. Prevents audio stream from stopping and */
	/* messing up timestamps and other weird glitches during silence */
	/* by playing a silent sample all over again. */

	res = client->GetBufferSize(&frames);
	if (FAILED(res))
		throw HRError("Failed to get buffer size", res);

	res = client->GetService(__uuidof(IAudioRenderClient),
		(void**)render.Assign());
	if (FAILED(res))
		throw HRError("Failed to get render client", res);

	res = render->GetBuffer(frames, &buffer);
	if (FAILED(res))
		throw HRError("Failed to get buffer", res);

	memset(buffer, 0, frames*wfex->nBlockAlign);

	render->ReleaseBuffer(frames, 0);
}
Example #4
0
void TextService::setGlobalCompartmentValue(const GUID& key, DWORD value) {
	if(threadMgr_) {
		ComPtr<ITfCompartment> compartment = globalCompartment(key);
		if(compartment) {
			VARIANT var;
			::VariantInit(&var);
			var.vt = VT_I4;
			var.lVal = value;
			compartment->SetValue(clientId_, &var);
		}
	}
	else {
		// if we don't have a thread manager (this is possible when we try to set
		// a global compartment value while the text service is not activated)
		ComPtr<ITfThreadMgr> threadMgr;
		if(::CoCreateInstance(CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfThreadMgr, (void**)&threadMgr) == S_OK) {
			if(threadMgr) {
				ComPtr<ITfCompartmentMgr> compartmentMgr;
				if(threadMgr->GetGlobalCompartment(&compartmentMgr) == S_OK) {
					ComPtr<ITfCompartment> compartment;
					if(compartmentMgr->GetCompartment(key, &compartment) == S_OK && compartment) {
						TfClientId id;
						if(threadMgr->Activate(&id) == S_OK) {
							VARIANT var;
							::VariantInit(&var);
							var.vt = VT_I4;
							var.lVal = value;
							compartment->SetValue(id, &var);
							threadMgr->Deactivate();
						}
					}
				}
			}
		}
	}
}
//
//  InitializeAudioDeviceAsync()
//
//  Activates the default audio capture on a asynchronous callback thread.  This needs
//  to be called from the main UI thread.
//
HRESULT AudioCaptureDevice::InitializeAudioDevice(UINT reflexIntervalMilliSec)
{
	HRESULT hr = S_OK;
	DWORD dwTaskID = 0;
	REFERENCE_TIME bufferRefTime = reflexIntervalMilliSec * REFTIMES_PER_MILLISEC;

	hr = MFStartup(MF_VERSION);
	if (FAILED(hr))
	{
		SetState(DeviceState::DeviceStateInError, hr, true);
		return hr;
	}

	// Initialize Critial Section
	if (!InitializeCriticalSectionEx(&m_CritSec, 0, 0))
	{
		SetState(DeviceState::DeviceStateInError, hr, true);
		return HRESULT_FROM_WIN32(GetLastError());
	}

	// Find and Active the first audio recorder
	{
		ComPtr<IMMDeviceEnumerator> pEnumerator = nullptr;
		ComPtr<IMMDevice> pDevice = nullptr;


		hr = CoCreateInstance(
			CLSID_MMDeviceEnumerator, NULL,
			CLSCTX_ALL, IID_IMMDeviceEnumerator,
			(void**) &pEnumerator);

		if (FAILED(hr))
		{
			SetState(DeviceState::DeviceStateInError, hr, true);
			return hr;
		}

		// Get a string representing the Default Audio Capture Device
		hr = pEnumerator->GetDefaultAudioEndpoint(
			eCapture, eConsole, &pDevice);

		if (FAILED(hr))
		{
			SetState(DeviceState::DeviceStateInError, hr, true);
			return hr;
		}


#ifdef ACTIVE_AUDIO_ASYNC

		ComPtr<IActivateAudioInterfaceAsyncOperation> pAsyncOp = nullptr;

		LPWSTR endPointId = L"\\?\SWD#MMDEVAPI#{0.0.1.00000000}.{963a2c89-65fe-46f1-850d-4eea82af65b2}#{2eef81be-33fa-4800-9670-1cd474972c3f}";

		hr = pDevice->GetId(&endPointId);

		// This call must be made on the main UI thread.  Async operation will call back to 
		// IActivateAudioInterfaceCompletionHandler::ActivateCompleted, which must be an agile interface implementation
		hr = ActivateAudioInterfaceAsync(endPointId, __uuidof(IAudioClient), nullptr, this, &pAsyncOp);
		if (FAILED(hr))
		{
			SetState(DeviceState::DeviceStateInError, hr, true);
		}
#else // ACTIVE_AUDIO_ASYNC
		hr = pDevice->Activate(IID_IAudioClient, CLSCTX_ALL, NULL, (void**) &m_AudioClient);

		if (FAILED(hr))
		{
			SetState(DeviceState::DeviceStateInError, hr, true);
			return hr;
		}
	}

	hr = m_AudioClient->GetMixFormat(&m_MixFormat);

	if (FAILED(hr))
	{
		SetState(DeviceState::DeviceStateInError, hr, true);
		return hr;
	}
	// convert from Float to PCM and from WAVEFORMATEXTENSIBLE to WAVEFORMATEX
	if ((m_MixFormat->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) ||
		((m_MixFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE) &&
		(reinterpret_cast<WAVEFORMATEXTENSIBLE *>(m_MixFormat)->SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)))
	{
		m_MixFormat->wFormatTag = WAVE_FORMAT_PCM;
		m_MixFormat->wBitsPerSample = 16;
		m_MixFormat->nBlockAlign = m_MixFormat->nChannels * 2;    // (nChannels * wBitsPerSample) / 8
		m_MixFormat->nAvgBytesPerSec = m_MixFormat->nSamplesPerSec * m_MixFormat->nBlockAlign;
		m_MixFormat->cbSize = 0;
	}

	// Initialize the AudioClient in Shared Mode with the user specified buffer
	hr = m_AudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED,
		AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
		bufferRefTime,
		0,
		m_MixFormat,
		nullptr);

	if (m_pAudioSink != nullptr)
		hr = m_pAudioSink->OnFormatChange(m_MixFormat);

	// Get the maximum size of the AudioClient Buffer
	hr = m_AudioClient->GetBufferSize(&m_BufferFrames);

	if (FAILED(hr))
	{
		SetState(DeviceState::DeviceStateInError, hr, true);
		return hr;
	}

	// Get the capture client
	hr = m_AudioClient->GetService(__uuidof(IAudioCaptureClient), &m_AudioCaptureClient);

	if (FAILED(hr))
	{
		SetState(DeviceState::DeviceStateInError, hr, true);
		return hr;
	}

	// Create events for sample ready or user stop
	m_SampleReadyEvent = CreateEventEx(nullptr, nullptr, 0, EVENT_ALL_ACCESS);
	if (nullptr == m_SampleReadyEvent)
	{
		SetState(DeviceState::DeviceStateInError, hr, true);
		return HRESULT_FROM_WIN32(GetLastError());
	}

	// Register MMCSS work queue
	hr = MFLockSharedWorkQueue(L"Capture", 0, &dwTaskID, &m_dwQueueID);
	if (FAILED(hr))
	{
		SetState(DeviceState::DeviceStateInError, hr, true);
		return hr;
	}

	// Set the capture event work queue to use the MMCSS queue
	cb_SampleReady.SetQueueID(m_dwQueueID);
	// Sets the event handle that the system signals when an audio buffer is ready to be processed by the client
	hr = m_AudioClient->SetEventHandle(m_SampleReadyEvent);

	if (FAILED(hr))
	{
		SetState(DeviceState::DeviceStateInError, hr, true);
		return hr;
	}

#endif // ACTIVE_AUDIO_ASYNC

	SetState(DeviceState::DeviceStateInitialized, hr, true);
	return hr;
}
Example #6
0
// To be called from the XAML thread
QWinRTScreen::QWinRTScreen()
    : d_ptr(new QWinRTScreenPrivate)
{
    Q_D(QWinRTScreen);
    d->orientation = Qt::PrimaryOrientation;
    d->touchDevice = Q_NULLPTR;

    HRESULT hr;
    ComPtr<Xaml::IWindowStatics> windowStatics;
    hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_UI_Xaml_Window).Get(),
                                IID_PPV_ARGS(&windowStatics));
    Q_ASSERT_SUCCEEDED(hr);
    ComPtr<Xaml::IWindow> window;
    hr = windowStatics->get_Current(&window);
    Q_ASSERT_SUCCEEDED(hr);
    hr = window->Activate();
    Q_ASSERT_SUCCEEDED(hr);

    hr = window->get_CoreWindow(&d->coreWindow);
    Q_ASSERT_SUCCEEDED(hr);
    hr = d->coreWindow->Activate();
    Q_ASSERT_SUCCEEDED(hr);

    Rect rect;
    hr = d->coreWindow->get_Bounds(&rect);
    Q_ASSERT_SUCCEEDED(hr);
    d->logicalSize = QSizeF(rect.Width, rect.Height);

    // Orientation handling
    ComPtr<IDisplayInformationStatics> displayInformationStatics;
    hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Graphics_Display_DisplayInformation).Get(),
                                IID_PPV_ARGS(&displayInformationStatics));
    Q_ASSERT_SUCCEEDED(hr);

    hr = displayInformationStatics->GetForCurrentView(&d->displayInformation);
    Q_ASSERT_SUCCEEDED(hr);

    // Set native orientation
    DisplayOrientations displayOrientation;
    hr = d->displayInformation->get_NativeOrientation(&displayOrientation);
    Q_ASSERT_SUCCEEDED(hr);
    d->nativeOrientation = static_cast<Qt::ScreenOrientation>(static_cast<int>(qtOrientationsFromNative(displayOrientation)));
    // Set initial pixel density
    onDpiChanged(Q_NULLPTR, Q_NULLPTR);
    d->orientation = d->nativeOrientation;

    ComPtr<IApplicationViewStatics2> applicationViewStatics;
    hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_UI_ViewManagement_ApplicationView).Get(),
                                IID_PPV_ARGS(&applicationViewStatics));
    RETURN_VOID_IF_FAILED("Could not get ApplicationViewStatics");

    hr = applicationViewStatics->GetForCurrentView(&d->view);
    RETURN_VOID_IF_FAILED("Could not access currentView");

    // Create a canvas and set it as the window content. Eventually, this should have its own method so multiple "screens" can be added
    ComPtr<Xaml::Controls::ICanvas> canvas;
    hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_UI_Xaml_Controls_Canvas).Get(), &canvas);
    Q_ASSERT_SUCCEEDED(hr);
    ComPtr<Xaml::IFrameworkElement> frameworkElement;
    hr = canvas.As(&frameworkElement);
    Q_ASSERT_SUCCEEDED(hr);
    hr = frameworkElement->put_Width(d->logicalSize.width());
    Q_ASSERT_SUCCEEDED(hr);
    hr = frameworkElement->put_Height(d->logicalSize.height());
    Q_ASSERT_SUCCEEDED(hr);
    ComPtr<Xaml::IUIElement> uiElement;
    hr = canvas.As(&uiElement);
    Q_ASSERT_SUCCEEDED(hr);
    hr = window->put_Content(uiElement.Get());
    Q_ASSERT_SUCCEEDED(hr);
    hr = canvas.As(&d->canvas);
    Q_ASSERT_SUCCEEDED(hr);

    d->cursor.reset(new QWinRTCursor);

#ifdef Q_OS_WINPHONE
    ComPtr<IStatusBarStatics> statusBarStatics;
    hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_UI_ViewManagement_StatusBar).Get(),
                                IID_PPV_ARGS(&statusBarStatics));
    Q_ASSERT_SUCCEEDED(hr);
    hr = statusBarStatics->GetForCurrentView(&d->statusBar);
    Q_ASSERT_SUCCEEDED(hr);
#endif // Q_OS_WINPHONE
}
Example #7
0
HRESULT HDMediaSource::SelectStreams(IMFPresentationDescriptor* ppd,const PROPVARIANT& varStartPosition,bool seek,bool sendstart)
{
	_nPendingEOS = 0;

	unsigned count = _streamList.Count();
	for (unsigned i = 0;i < count;i++)
	{
		BOOL fSelected = FALSE;
		ComPtr<IMFStreamDescriptor> psd;

		HRESULT hr = ppd->GetStreamDescriptorByIndex(i,&fSelected,psd.GetAddressOf());
		if (FAILED(hr))
			return hr;

		DWORD dwStreamId = 0xFFFFFFFF;
		hr = psd->GetStreamIdentifier(&dwStreamId);
		if (FAILED(hr))
			return hr;

		if (dwStreamId == 0xFFFFFFFF)
			continue;

		ComPtr<HDMediaStream> pStream;
		hr = FindMediaStreamById((int)dwStreamId,pStream.GetAddressOf());
		if (FAILED(hr))
			return hr;

		if (seek)
			pStream->DisablePrivateData();
		else
			pStream->EnablePrivateData();

		BOOL fWasSelected = pStream->IsActive();

		pStream->Activate(!!fSelected);

		if (fSelected)
		{
			_nPendingEOS++;

			hr = _pEventQueue->QueueEventParamUnk(fWasSelected ? MEUpdatedStream:MENewStream,
				GUID_NULL,S_OK,pStream.Get());

			if (FAILED(hr))
				return hr;

			if (sendstart) {
				hr = pStream->Start(varStartPosition,seek);
				if (FAILED(hr))
					return hr;
			}

			if (_network_mode)
				pStream->SetPrerollTime(_network_preroll_time);
		}
	}

	DbgLogPrintf(L"%s::DoStart->SelectStreams %d.",L"HDMediaSource",_nPendingEOS);

	return S_OK;
}