Removed initialisation and setup work from main.
Also removed most of the work done in the while loop. This has been replaced by function calls to an external files The loop work has been replaced largely by callbacks on session start or stop. This is not a working stage commit, just a small batch of changes.
This commit is contained in:
parent
8390cc12f7
commit
00cd3ea11b
152
main.c
152
main.c
|
@ -1,10 +1,6 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <Windows.h>
|
||||
#include "CLSIDs_and_IIDs.h"
|
||||
#include <combaseapi.h>
|
||||
#include <mmdeviceapi.h>
|
||||
#include <audiopolicy.h>
|
||||
#include"IAudioSessionNotification.h"
|
||||
#include "AudioSesssions_framework.h"
|
||||
|
||||
void printLoadingTicker( void );
|
||||
// This expects HRESULT from the function to be called result
|
||||
|
@ -17,99 +13,40 @@ int main(void)
|
|||
printf("Compiled %s", __TIME__);
|
||||
printf("\nStarting");
|
||||
|
||||
HRESULT result = 1;
|
||||
result = CoInitializeEx(NULL, COINIT_MULTITHREADED);
|
||||
//result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
||||
checkHRESULT;
|
||||
// Have a look at this at a later date
|
||||
//checkHRESULT(CoInitializeEx(NULL, COINIT_MULTITHREADED));
|
||||
/*
|
||||
The audio sessions information strut contains all the information needed to perform actions on the audio streams
|
||||
The IMM enumerator of all IMM devices
|
||||
This includes the IMM interface to the default audio device
|
||||
The number of open audio sessions at any time
|
||||
A pointer to block of memory containing an array of pointers to audio session control interfaces
|
||||
*/
|
||||
AudioSessionsInformation AudioSessionsInformation = {.AudioSessionControlsCollection = NULL, .NumberAudioSessionsActive = 0};
|
||||
|
||||
initialiseSessionsFramework(&AudioSessionsInformation);
|
||||
|
||||
IAudioSessionControl* AudioSessionControls[10];
|
||||
// I can't seem to get this to work dynamically assigning the memory
|
||||
//IAudioSessionControl** AudioSessionControls;
|
||||
int numberSessionControls = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
IMMDeviceEnumerator* myIMMDeviceEnumerator = NULL;
|
||||
result = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, &IID_IMMDeviceEnumerator, &myIMMDeviceEnumerator);
|
||||
checkHRESULT;
|
||||
|
||||
IMMDevice* myIMMDevice;
|
||||
myIMMDeviceEnumerator->lpVtbl->GetDefaultAudioEndpoint(myIMMDeviceEnumerator, eRender, eMultimedia, &myIMMDevice);
|
||||
checkHRESULT;
|
||||
|
||||
|
||||
IAudioSessionManager2* myAudioSessionManager2 = NULL;
|
||||
result = myIMMDevice->lpVtbl->Activate(myIMMDevice, &IID_IAudioSessionManager2, CLSCTX_ALL, NULL, &myAudioSessionManager2);
|
||||
checkHRESULT;
|
||||
|
||||
IAudioSessionEnumerator* myAudioSessionEnumerator;
|
||||
result = myAudioSessionManager2->lpVtbl->GetSessionEnumerator(myAudioSessionManager2, &myAudioSessionEnumerator);
|
||||
checkHRESULT;
|
||||
|
||||
int sessions;
|
||||
result = myAudioSessionEnumerator->lpVtbl->GetCount(myAudioSessionEnumerator, &sessions);
|
||||
checkHRESULT;
|
||||
|
||||
IAudioSessionNotification* myAudioSessionNotification;
|
||||
result = InitializeAudioSessionNotification(&myAudioSessionNotification, &AudioSessionControls, &numberSessionControls);
|
||||
checkHRESULT;
|
||||
|
||||
result = myAudioSessionManager2->lpVtbl->RegisterSessionNotification(myAudioSessionManager2, myAudioSessionNotification);
|
||||
checkHRESULT;
|
||||
|
||||
int i = 0;
|
||||
int newSessionCount = 0;
|
||||
while (1)
|
||||
Sleep(50);
|
||||
if (AudioSessionsInformation.NumberAudioSessionsActive != numberSessionControls)
|
||||
{
|
||||
Sleep(50);
|
||||
//printLoadingTicker();
|
||||
i++;
|
||||
if (i > 20000)
|
||||
printf("\nNew Session control added");
|
||||
for (int i = 0; i < AudioSessionsInformation.NumberAudioSessionsActive; i++)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (newSessionCount != numberSessionControls)
|
||||
{
|
||||
printf("\nNew Session control added");
|
||||
|
||||
newSessionCount = numberSessionControls;
|
||||
LPWSTR IconPath = NULL;
|
||||
//AudioSessionsInformation.AudioSessionControlsCollection[i]->lpVtbl->GetDisplayName(AudioSessionsInformation.AudioSessionControlsCollection[i],
|
||||
// &IconPath);
|
||||
//printf("\nIcon path of session %d is: %ws", i, IconPath);
|
||||
|
||||
for (int ii = 0; ii < numberSessionControls; ii++)
|
||||
{
|
||||
|
||||
IAudioSessionControl * ActiveSessionControl = *(AudioSessionControls + ii);
|
||||
LPWSTR iconPath;
|
||||
result = ActiveSessionControl->lpVtbl->GetIconPath(ActiveSessionControl, &iconPath);
|
||||
printf("\nSession iconPath = %ls", iconPath);
|
||||
|
||||
IAudioSessionControl2* myAudioSessionControl2;
|
||||
result = ActiveSessionControl->lpVtbl->QueryInterface(ActiveSessionControl, &IID_IAudioSessionControl2, &myAudioSessionControl2);
|
||||
checkHRESULT;
|
||||
DWORD processID = 0;
|
||||
result = myAudioSessionControl2->lpVtbl->GetProcessId(myAudioSessionControl2, &processID);
|
||||
checkHRESULT;
|
||||
printf("Process ID of control instance %d is %d", ii, processID);
|
||||
|
||||
}
|
||||
|
||||
|
||||
AudioSessionsInformation.AudioSessionControlsCollection[i]->lpVtbl->GetDisplayName(AudioSessionsInformation.AudioSessionControlsCollection[i],
|
||||
&IconPath);
|
||||
printf("\nName of session %d is: %ws", i, IconPath);
|
||||
}
|
||||
|
||||
|
||||
numberSessionControls = AudioSessionsInformation.NumberAudioSessionsActive;
|
||||
}
|
||||
|
||||
// The session manager notification unregister function also calls release on the audio session notification interface
|
||||
result = myAudioSessionManager2->lpVtbl->UnregisterSessionNotification(myAudioSessionManager2, myAudioSessionNotification);
|
||||
checkHRESULT;
|
||||
|
||||
myAudioSessionManager2->lpVtbl->Release(myAudioSessionManager2);
|
||||
myAudioSessionEnumerator->lpVtbl->Release(myAudioSessionEnumerator);
|
||||
myIMMDevice->lpVtbl->Release(myIMMDevice);
|
||||
//printf("\rNext \n");
|
||||
}
|
||||
|
||||
printf("\nFinished");
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -154,43 +91,4 @@ void printLoadingTicker(void)
|
|||
count++;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
HRESULT checkSessions(IAudioSessionManager2* myAudioSessionManager2)
|
||||
{
|
||||
static int sessionCount = 0;
|
||||
// Gets a new enumerator object with all the sessions
|
||||
IAudioSessionEnumerator* myAudioSessionEnumerator;
|
||||
HRESULT result = myAudioSessionManager2->lpVtbl->GetSessionEnumerator(myAudioSessionManager2, &myAudioSessionEnumerator);
|
||||
// Checks how many sessions there are now
|
||||
int newSessionCount = -1;
|
||||
result = myAudioSessionEnumerator->lpVtbl->GetCount(myAudioSessionEnumerator, &newSessionCount);
|
||||
|
||||
if (newSessionCount != sessionCount)
|
||||
{
|
||||
sessionCount = newSessionCount;
|
||||
result = getNewSessions(sessionCount, &myAudioSessionEnumerator);
|
||||
}
|
||||
|
||||
printLoadingTicker();
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
HRESULT getNewSessions(int numberOfSessions, IAudioSessionEnumerator* myAudioSessionEnumerator)
|
||||
{
|
||||
for (int i = 0; i < numberOfSessions; i++)
|
||||
{
|
||||
IAudioSessionControl* myAudioSessionControl;
|
||||
HRESULT result = myAudioSessionEnumerator->lpVtbl->GetSession(myAudioSessionEnumerator, i, &myAudioSessionControl);
|
||||
IAudioSessionControl2* myAudioSessionControl2;
|
||||
result = myAudioSessionControl->lpVtbl->QueryInterface(myAudioSessionControl, &IID_IAudioSessionControl2, CLSCTX_ALL, &myAudioSessionControl2);
|
||||
|
||||
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
*/
|
||||
}
|
Loading…
Reference in New Issue