Skip to content

Instantly share code, notes, and snippets.

@White2001Offl
Last active July 13, 2021 10:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save White2001Offl/1f5c6dc7189b63c3087d889a30a75f4b to your computer and use it in GitHub Desktop.
Save White2001Offl/1f5c6dc7189b63c3087d889a30a75f4b to your computer and use it in GitHub Desktop.
Its a small gist helps to know which apps using microphone ( which are in active state)
module microphone
go 1.14
require (
github.com/go-ole/go-ole v1.2.4
github.com/moutend/go-wca v0.2.0
)
github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
github.com/moutend/go-wca v0.2.0 h1:AEzY6ltC5zPCldKyMYdyXv3TaLqwxSW1TIradqNqRpU=
github.com/moutend/go-wca v0.2.0/go.mod h1:L/ka++dPvkHYz0UuQ/PIQ3aTuecoXOIM1RSAesh6RYU=
package main
import (
"fmt"
"github.com/go-ole/go-ole"
"github.com/moutend/go-wca/pkg/wca"
"log"
"strconv"
)
func main(){
if err:= ole.CoInitialize(0); err != nil{
log.Println("Error in initialize")
log.Fatalln(err.Error())
}
pEnumator := &wca.IMMDeviceEnumerator{}
pSessionManager := &wca.IAudioSessionManager2{}
if err := wca.CoCreateInstance(wca.CLSID_MMDeviceEnumerator,0,wca.CLSCTX_ALL,wca.IID_IMMDeviceEnumerator,&pEnumator); err != nil{
log.Fatalln(err.Error())
}
dCol := &wca.IMMDeviceCollection{}
if err := pEnumator.EnumAudioEndpoints(wca.ECapture,wca.DEVICE_STATE_ACTIVE,&dCol); err != nil{
log.Fatalln(err.Error())
}
var dCount uint32
if err := dCol.GetCount(&dCount); err != nil{
log.Fatalln(err.Error())
}
var i uint32
for i = 0; i < dCount; i++{
pCaptureDevice := &wca.IMMDevice{}
if err := dCol.Item(i,&pCaptureDevice); err != nil{
log.Fatalln(err.Error())
}
pProps := &wca.IPropertyStore{}
if err := pCaptureDevice.OpenPropertyStore(wca.STGM_READ,&pProps); err != nil{
log.Fatalln(err.Error())
}
varName := &wca.PROPVARIANT{}
if err := pProps.GetValue(&wca.PKEY_Device_FriendlyName,varName); err != nil{
log.Fatalln(err.Error())
}
device := varName.String()
fmt.Println("\n\nMicrophone: " + device)
if err := pCaptureDevice.Activate(wca.IID_IAudioSessionManager2,wca.CLSCTX_ALL,0,&pSessionManager); err != nil{
log.Fatalln(err)
}
if pSessionManager == nil{
log.Fatalln("Not found session manager!")
}
cbSessionCount := 0
pSessionList := &wca.IAudioSessionEnumerator{}
pSessionControl := &wca.IAudioSessionControl{}
pSessionControl2 := &wca.IAudioSessionControl2{}
if err := pSessionManager.GetSessionEnumerator(&pSessionList); err != nil{
log.Fatalln(err)
}
if err := pSessionList.GetCount(&cbSessionCount); err != nil{
log.Fatalln(err)
}
log.Println(fmt.Sprintf("Session Count: %v", cbSessionCount))
for j := 0; j<cbSessionCount; j++{
fmt.Println("\n\nSession " + strconv.Itoa(j) + ":-")
if err := pSessionList.GetSession(j,&pSessionControl); err != nil{
log.Fatalln(err)
}
if err := pSessionControl.PutQueryInterface(wca.IID_IAudioSessionControl2,&pSessionControl2); err != nil{
log.Fatalln(err)
}
instID := ""
if err := pSessionControl2.GetSessionInstanceIdentifier(&instID); err != nil{
log.Fatalln(err)
}
log.Println(fmt.Sprintf("SessionInstanceIdentifier: %v",instID))
var state uint32
if err := pSessionControl.GetState(&state); err != nil{
log.Fatalln(err)
}
switch state {
case wca.AudioSessionStateActive:
log.Println("Session state: Active")
break
case wca.AudioSessionStateInactive:
log.Println("Session State: Inactive")
break
case wca.AudioSessionStateExpired:
log.Println("Session State: Expired")
break
default:
log.Println("Session State: Not Found")
}
}
}
}
@White2001Offl
Copy link
Author

White2001Offl commented Jul 13, 2021

An example of how it shows

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment