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:
Thomas Wilkie 2023-09-24 21:39:54 +09:00
parent 8390cc12f7
commit 00cd3ea11b
1 changed files with 25 additions and 127 deletions

152
main.c
View File

@ -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;
}
*/
}