xenolightning / audioswitcher Goto Github PK
View Code? Open in Web Editor NEW.NET Library which facilitates interacting with Audio Devices on Windows
License: Microsoft Public License
.NET Library which facilitates interacting with Audio Devices on Windows
License: Microsoft Public License
Are you able by any chance to release a new NuGet package. I am having a lot of issues with setting volume and memory corruptions which seem to be fixed with your latest changes which are not yet available via NuGet.
Thanks.
No way to set default communication device alongside default recording device? In teamspeak 3 and other programs the default communications device is the actual default recording device, can this be added so it can also be changed? Other than that, fantastic program.
Hi, I'm looking for a way to detect when a device has been disconnected. CoreAudioDevice.SessionController.SessionDisconnected is called when a device is disconnected from the machine, but is seems to be only called once, and is not called for subsequent reconnections and disconnections.
You have created issue #39 to expose aggregate session messages through a single point. Have there been any updates regarding this issue?
Is there some other work around to reliably get messages when a device is connected and disconnected?
Kind regards,
Anders Egberts
Hi, I'm creating a simple audio project. But I would like to know if I can pass the limit of 100% of the volume (like the google extensions for volumegain) I am programming in C#
new CoreAudioController() never returns
Very strange behaviour here. I've written an app that can do different things based on the command line parameter.
I use this library to set the desired volume for each task.
Option 1 is started through the Windows task scheduler at every full hour.
I can start option 2 interactively. It's a console application that only plays a sound (with NAudio) every few minutes.
Now when the interactive program is running and the keep-alive tasks runs in the background, then the interactive program crashes with a NullReferenceException in AudioSwitcher.AudioApi.CoreAudio.CoreAudioSession.Dispose(), called from AudioSwitcher.AudioApi.CoreAudio.CoreAudioSession.Finalize(). That's all I get when I attach a Visual Studio debugger. The exception is not in my code so I can't see it. Also, the exception occurs in another process than was started.
What is it doing there that affects other processes using the same library?
Here's the keep-alive part:
Guid deviceGuid = DirectSoundOut.DSDEVID_DefaultPlayback;
foreach (var dev in DirectSoundOut.Devices)
{
if (dev.Description.Contains(name))
deviceGuid = dev.Guid;
}
var cac = new CoreAudioController();
caDevice = cac.GetDevice(deviceGuid);
if (caDevice == null)
return false;
bool wasMuted = caDevice.IsMuted;
double previousVolume = caDevice.Volume;
if (wasMuted)
caDevice.Mute(false);
caDevice.Volume = 5;
PlaySine(19000, 0.5, 0.5); // with NAudio
Thread.Sleep(50);
caDevice.Volume = previousVolume;
if (wasMuted)
caDevice.Mute(true);
caDevice.Dispose();
The interactive task doesn't do anything while it crashes. It has played a sound before but isn't currently playing when the keep-alive task starts. So it's not interacting with the library and sits in a Sleep call somewhere while it dies.
Some IAudioSession that I get from CoreAudioController().DefaultPlaybackDevice.SessionController have invalid information, such as blank DisplayName(s) or no ExecutablePath(s), even though I still can control their volume by modifying their .Volume attribute. Is it my fault or is it an issue? (some apps that cause this are Chrome, Teamspeak or the internal System sounds.
The issue is raised every time I leave my application running for about 3 days. I don't have a full stacktrace, because the exception is caught in AppDomain.CurrentDomain.UnhandledException but it's something like this:
2019-03-19 12:22:50.6656|ERROR|WindowsServiceClient.WindowsClient|Domain unhandled exceptionSystem.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Diagnostics.NtProcessInfoHelper.GetProcessInfos(IntPtr dataPtr, Predicate`1 processIdFilter)
at System.Diagnostics.NtProcessInfoHelper.GetProcessInfos(Predicate`1 processIdFilter)
at System.Diagnostics.ProcessManager.GetProcessInfosCore(String machineName, Boolean isRemoteMachine)
at System.Diagnostics.Process.GetProcesses(String machineName)
at System.Diagnostics.Process.GetProcesses()
at AudioSwitcher.AudioApi.CoreAudio.ProcessMonitor.ProcessTerminatedCheck(Object state)
at System.Threading.TimerQueueTimer.CallCallbackInContext(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
at System.Threading.TimerQueue.AppDomainTimerCallback()
2019-03-19 12:22:26.2306|ERROR|WindowsServiceClient.WindowsClient|Domain unhandled exceptionSystem.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Collections.ArrayList.set_Capacity(Int32 value)
at System.Collections.ArrayList.EnsureCapacity(Int32 min)
at System.Collections.ArrayList.Add(Object value)
at System.Diagnostics.NtProcessInfoHelper.GetProcessInfos(IntPtr dataPtr, Predicate`1 processIdFilter)
at System.Diagnostics.NtProcessInfoHelper.GetProcessInfos(Predicate`1 processIdFilter)
at System.Diagnostics.ProcessManager.GetProcessInfosCore(String machineName, Boolean isRemoteMachine)
at System.Diagnostics.Process.GetProcesses(String machineName)
at System.Diagnostics.Process.GetProcesses()
at AudioSwitcher.AudioApi.CoreAudio.ProcessMonitor.ProcessTerminatedCheck(Object state)
at System.Threading.TimerQueueTimer.CallCallbackInContext(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
at System.Threading.TimerQueue.AppDomainTimerCallback()
2019-03-19 12:22:50.6656|ERROR|WindowsServiceClient.WindowsClient|Domain unhandled exceptionSystem.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.String.CtorCharPtrStartLength(Char* ptr, Int32 startIndex, Int32 length)
at System.Runtime.InteropServices.Marshal.PtrToStringUni(IntPtr ptr, Int32 len)
at System.Diagnostics.NtProcessInfoHelper.GetProcessInfos(IntPtr dataPtr, Predicate`1 processIdFilter)
at System.Diagnostics.NtProcessInfoHelper.GetProcessInfos(Predicate`1 processIdFilter)
at System.Diagnostics.ProcessManager.GetProcessInfosCore(String machineName, Boolean isRemoteMachine)
at System.Diagnostics.Process.GetProcesses(String machineName)
at System.Diagnostics.Process.GetProcesses()
at AudioSwitcher.AudioApi.CoreAudio.ProcessMonitor.ProcessTerminatedCheck(Object state)
at System.Threading.TimerQueueTimer.CallCallbackInContext(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
at System.Threading.TimerQueue.AppDomainTimerCallback()
2019-03-19 12:22:50.6656|ERROR|WindowsServiceClient.WindowsClient|Domain unhandled exceptionSystem.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Linq.Set`1.Resize()
at System.Linq.Set`1.Find(TElement value, Boolean add)
at System.Linq.Enumerable.<ExceptIterator>d__73`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at AudioSwitcher.AudioApi.CoreAudio.ProcessMonitor.ProcessTerminatedCheck(Object state)
at System.Threading.TimerQueueTimer.CallCallbackInContext(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
at System.Threading.TimerQueue.AppDomainTimerCallback()
The system I'm running has 32GB of RAM and at the point when this exception is invoked I don't observe any huge system memory consumption.
I'm using VS2017 on Windows 10. My WPF application is using the lastest version of this API and has a Realtek onboard sound card
I want to set the volume of the windows setting to max like that:
CoreAudioDevice defaultCaptureDevice = new CoreAudioController().DefaultCaptureDevice;
defaultCaptureDevice.Volume = 100;
So far it's working but after the first call my CPU usage is increasing and I constantely receive this message in the VS2017 output window:
"System.NullReferenceException" in AudioSwitcher.AudioApi.CoreAudio.dll
"System.NullReferenceException" in AudioSwitcher.AudioApi.CoreAudio.dll
"System.NullReferenceException" in AudioSwitcher.AudioApi.CoreAudio.dll
"System.NullReferenceException" in AudioSwitcher.AudioApi.CoreAudio.dll
"System.NullReferenceException" in AudioSwitcher.AudioApi.CoreAudio.dll
"System.NullReferenceException" in AudioSwitcher.AudioApi.CoreAudio.dll
....
It's not stopping. What is wrong?
I'm using AudioSwitcher.AudioApi.CoreAudio. 3.0.0.1 And I have to problem with Win 7 and Win 10
My WPF application has as target framework .NET 4.5.2
In AudioController.cs the methods GetDevices(DeviceState)
, GetDevicesAsync(DeviceState)
and GetDeviceAsync(Guid, DeviceState)
do not use the specified DeviceState parameter and instead result in using DEFAULT_DEVICE_STATE_FILTER.
When devices are newly connected the system events can fire before the device is ready.
There should be a prevention mechanism to stop creation of invalid devices until they are "ready".
There is a lot of "fake async" calls in the current api.
These should be replaced with truly sync and async counterparts to improve performance.
Candidates for natural async:
Along with this, all Task.Factory.StartNew
or Task.Run
faking async will be replace with a Task.FromResult
to not consume unnecessary resources.
This should not break any current functionality.
Looks like policy config 870AF99C-171D-4F9E-AF0D-E63DF40C2BC9 has been changed in Redstone 1 (windows 10 latest), any idea what is the new GUID? How to find it?
Audio Switcher
Version: 1.6.3.1
Operating System: Microsoft Windows NT 6.2.9200.0 64-bit
Administrator Privileges: False
unplugged a device i think
System.NullReferenceException: Object reference not set to an instance of an object.
at AudioSwitcher.AudioApi.CoreAudio.CoreAudioDevice.get_FullName()
at FortyOne.AudioSwitcher.AudioSwitcher.RefreshNotifyIconItems()
at FortyOne.AudioSwitcher.AudioSwitcher.RefreshPlaybackDevices()
I'm using Windows 8 enterprise 64bit, running the app with admin rights. I have a TV plugged into my gpu hdmi output, so it acts as a video and an audio device at the same time. Whenever I change my display mode (PC only, Extend, Second screen only) so that the TV is toggled (win+P) right clicking the AudioSwitcher makes it blink in and out and becomes unusable. I have to kill the process and restart. Looking into this would be much appreciated, your app is the best one I found so far. Let me know if I can provide any more details.
Noticed this unknown device bug for a while in the AudioSwitcher windows app and in my MP1-Audioswitcher (Mediaportal plugin) recently as well.
Steps to recreate
Current workarounds
RickDB/MP1-AudioSwitcher@a9d22e5
Possible solution in AudioSwitcher library might be to always reload the CoreAudio class in case of unknown devices during .GetDevices call however that is more of workaround than an actual fix.
Or during the reloading of device lists in library internally it does it too quickly during reconnects and requires a longer delay for certain sources (HDMI audio in this case)
Library version installed via Nuget:
AudioSwitcher.AudioApi
v4.0.30319
OS:
Windows 10 x64
Controlling desktop audio devices via Powershell is exactly what I'm looking for, but the links to the documentation seem to be broken. Also it would be helpful if there was a pre-compiled DLL and a sample script.
Sorry if I just missed any of the above.
Events are forwarded without the updates taking place.
Extract out a system notification source, and get each device to sub to events.
Use those events to propagate to controller
Add an aggregated endpoint for session state changes to the controller.
This provides a single point where all session state changes can be monitored instead of having to subscribe on each Session.
I'd like to be able to enable or disable audio devices. I can't seem to find a way to do so using the .NET API's, so I assume this feature does not exist.
edit going to repost this in the V1 issues instead of the .NET library. Sorry...
Thanks for this very handy little utility.
One thing I'd like to see added is some type of convention to change the playback and recording devices at the same time. Either through a hotkey or favorite selection.
Use case is that I've got two different device "profiles" (playback device + recording device) that I'd like to quickly switch between. I can almost get there now, it takes a couple clicks to do it, but it would be great if a combination could be created to change both at the same time.
There is an issue in the session create code which causes either COM Objects to be access in a non thread safe manner, or the lifecycle is disposed prematurely.
The session controller should probably not be a DeviceCapability
it causes oddities.
When a recording device is set as default it fires the event twice for the CoreAudioDevice. It should only fire once for a single default action.
System events fire twice, one for eRole.Console & eRole.Console. These should be aggregated so that only one event is fired internally.
The following is the error when calling the CoreAudioConstructor:
System.MethodAccessException: Method System.__ComObject..ctor()' is inaccessible from method
System.__ComObject..ctor()'
at (wrapper managed-to-native) System.Object.__icall_wrapper_mono_throw_method_access(intptr,intptr)
at System.__ComObject..ctor () [0x00000] in :0
at (wrapper cominterop-invoke) System.__ComObject..ctor()
at (wrapper managed-to-native) System.Reflection.MonoCMethod.InternalInvoke(System.Reflection.MonoCMethod,object,object[],System.Exception&)
at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) [0x00002] in :0
Extend the Api to be able to query and update the current speaker configuration on any supported device.
Docs of relevance:
IAudioChannelConfig https://msdn.microsoft.com/en-us/library/windows/desktop/dd370862%28v=vs.85%29.aspx
KSAUDIO_CHANNEL_CONFIG https://msdn.microsoft.com/en-us/library/windows/hardware/ff537083%28v=vs.85%29.aspx
I don't know if you will have time to look at a bug that appears on a beta OS.
However if you can provide a debug version with more trace, I would like to understand why it doesn't work!EDIT: this may help:
davkean/audio-switcher#32
@Nefast
Related Issue: xenolightning/AudioSwitcher_v1#850
just like clicking the try icon to cycle through the audio device. is there a hotley to add or configure to do the same function?
There are "too many" ways to set a device as a default.
Controller/Device, and there's a weird interdependence between the types because of this.
Default is a property of a device, therefore all setting of defaults will be done directly against the device, and not the controller.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.MethodAccessException: Method System.__ComObject..ctor()' is inaccessible from method System.__ComObject..ctor()'.
I have tried changing all internals to public, is it possible something else is wrong? This is on a Windows 10. Not sure what else you would need to know...
Thank you
Hi,
I'm not quite sure if this is the right place to put a request...
anyways - thank You very much for this app!
I wonder, if it's possible to connect disabled BT-devices ?
Cheers,
Stephan
See xenolightning/AudioSwitcher_v1#2008 for more details.
I am wondering how you find out the internal GUID. Which tools are you using?
Best regards
Anna
I have been trying to change the name property of a CoreAudio device with this library.
This could not work with the nuget package because I don't have access to the COM thread used in this library. To work around this I added this project as a subproject to mine and changed the ComThread class to public so that I could use it's invoke method to do operations I would want to do.
When I tried changing the name property this way(running as admin else the change would not be done) the desktop environment started flashing as if it was constantly reloading. Disabling the changed audio device through Control Panel would make the flashing stop. Reenabling would make the desktop flash again. After a reboot the system would behave normally again.
I have also seen that setting the name property was not covered by any of the tests
I used the following function to change the name of the default device:
static void Test() {
var controller = new CoreAudioController();
ComThread.Invoke(() => { controller.DefaultPlaybackDevice.Name = "Test"; });
}
I have done this for 2 devices I had available, my usb headset and my hdmi monitor.
Is this a bug or should setting the name not even be done with this library?
When the library is started with an audio device in "NotPresent/Unplugged" state, the VolumeChange events are not fired when this device is turned on later.
This is caused by GetAudioEndpointVolume called only in CoreAudioDevice constructor. It should be called in EnumeratorOnAudioDeviceChanged as well.
Quick - but working - fix that made the library work as expected for me - run the following in EnumeratorOnAudioDeviceChanged:
ComThread.BeginInvoke(() =>
{
LoadProperties(_device);
if (AudioMeterInformation == null)
{
GetAudioMeterInformation(_device);
}
if (AudioEndpointVolume == null)
{
GetAudioEndpointVolume(_device);
if (AudioEndpointVolume != null)
AudioEndpointVolume.OnVolumeNotification += AudioEndpointVolume_OnVolumeNotification;
}
})
I'm trying to set a default audio device on my computer like so:
bool ok = device.SetAsDefault();
Very often (seemingly at random) the call fails and returns false. Is this supposed to happen? Are there any more information available on why/when this happens?
Is there a way to ensure the default device is set?
An option to have one shortcut to toggle between devices, instead of having a shortcut per device.
Some sort of prompt on which device has been changed to would also be nice, preferably not as a taskbar notification.
Invalid devices are ignored during an "Add".
This may cause the Api to fail to further detect the device.
Possible solutions:
Hello,
I randomly encounter the following error in my program when using this library:
Exception thrown at 0x00007FF81DD03F80 (msvcrt.dll) in FireDeptStopwatch.exe: 0xC0000005: Access violation reading location 0x0000000014585ED8.
The following line of code is enough to trigger the exception:
var sessions = audioController.DefaultPlaybackDevice.GetCapability<IAudioSessionController>();
Any clue what might be wrong?
Hi,
i got an exception:
System.NullReferenceException ist aufgetreten.
HResult=0x80004003
Nachricht = Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Quelle = AudioSwitcher.AudioApi.CoreAudio
Stapelüberwachung:
bei AudioSwitcher.AudioApi.CoreAudio.CoreAudioDevice.<>c__DisplayClass55_0.<Timer_UpdatePeakValue>b__0()
Hope it helps.
Greetings
Audio Switcher
Version: 1.6.3.1
Operating System: Microsoft Windows NT 6.1.7601 Service Pack 1 64-bit
Administrator Privileges: False
System.Threading.LockRecursionException: In this mode, the import recursively read locks are not allowed.
Location: System.Threading.ReaderWriterLockSlim.TryEnterReadLockCore (TimeoutTracker timeout)
Location: System.Threading.ReaderWriterLockSlim.TryEnterReadLock (TimeoutTracker timeout)
Location: AudioSwitcher.AudioApi.CoreAudio.CoreAudioDeviceEnumerator.GetDevices (DeviceType deviceType, DeviceState state)
Location:AudioSwitcher.AudioApi.CoreAudio.CoreAudioDeviceEnumerator.AudioSwitcher.AudioApi.IDeviceEnumerator.GetDevices(DeviceType type, DeviceState eRole)
Location: FortyOne.AudioSwitcher.AudioSwitcher.RefreshPlaybackDevices ()
The latest one is from 2015... 😢
I'm trying to find a way, having retrieved reference to the device, of enumerating the properties (such as channel count, sampling rate, whether it allows exclusive mode access etc).. The Visual Studio object browser contents seem to imply the answer is "No", though it looks like some classes internally do reference or use the properties..
I have downloaded AudioSwitcher.AudioApi.CoreAudio using NuGet.
I was then trying to use GetMasterVolumeLevelScalar to get the Windows volume.
However, I don't find this function in the Api.
Could you give me a hint to get the MasterVolumeLevelScalar?
Events are fired correctly on the new default device, but not on old devices.
This will cause any current system which actively monitor the default device being set to false to have unexpected behavior.
Events should fire on the previous and current default device, to signal that default device has changed for both devices (because it has)
I'm probably being an idiot, but the NuGet library doesn't install because some of the packages aren't compatible with Windows Universal App Platform (UAP). I'll list the output I got:
`Restoring packages for 'CortanaComponent'.
Restoring packages for C:\Users\User\Documents\Visual Studio 2015\Projects\Cortana\CortanaComponent\project.json...
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0.
Some packages are not compatible with UAP,Version=v10.0.
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-arm).
Some packages are not compatible with UAP,Version=v10.0 (win10-arm).
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-arm-aot).
Some packages are not compatible with UAP,Version=v10.0 (win10-arm-aot).
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-x64).
Some packages are not compatible with UAP,Version=v10.0 (win10-x64).
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-x64-aot).
Some packages are not compatible with UAP,Version=v10.0 (win10-x64-aot).
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-x86).
Some packages are not compatible with UAP,Version=v10.0 (win10-x86).
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-x86-aot).
Some packages are not compatible with UAP,Version=v10.0 (win10-x86-aot).
Package restore failed for 'CortanaComponent'.
Restoring packages for 'HomeControl'.
Restoring packages for C:\Users\User\Documents\Visual Studio 2015\Projects\Cortana\CortanaExt\project.json...
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0.
Some packages are not compatible with UAP,Version=v10.0.
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-arm).
Some packages are not compatible with UAP,Version=v10.0 (win10-arm).
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-arm-aot).
Some packages are not compatible with UAP,Version=v10.0 (win10-arm-aot).
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-x64).
Some packages are not compatible with UAP,Version=v10.0 (win10-x64).
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-x64-aot).
Some packages are not compatible with UAP,Version=v10.0 (win10-x64-aot).
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-x86).
Some packages are not compatible with UAP,Version=v10.0 (win10-x86).
AudioSwitcher.AudioApi.CoreAudio 3.0.0.1 is not compatible with UAP,Version=v10.0 (win10-x86-aot).
Some packages are not compatible with UAP,Version=v10.0 (win10-x86-aot).
Package restore failed for 'CortanaExt'.
Package restore failed. Rolling back package changes for 'CortanaComponent'.
========== Finished ==========
`
Multi-target the Base Api library AudioSwitcher.AudioApi to .NET Core in preparation for cross platform support.
Every time I create a new tab in FireFox, the SessionCreated fires, and a new audio session is also visible in the Windows volume mixer.
When I close one tab, the SessionDisconnected event fires like you would expect, and the session disappears from the Windows volume mixer.
The problem is, that this is the only SessionDisconnected event I will get. Closing any more tabs doesn't fire the event again, and even closing FireFox altogether doesn't work.
As a side note: Even if the event were to go off for every session created by FireFox, I have no way of knowing which session was actually removed, since the ID is the same for every session. As far as I can tell the only thing differentiating the sessions is the ProcessID.
Windows 10 changed the IID again in Creators Update.
@xenolightning I suppose you might need the following:
internal const string POLICY_CONFIG_X_RS2_IID = "098FF37B-1062-4B1A-AD73-2A2D530FEAB6";
Disposed instances with direct delegate roots (Show details) (Ignore...)
One type has instances that are disposed and directly rooted by a delegate. This often indicates that the delegate has not been properly removed and is a common cause of memory leaks.
Investigate the type below for more information.
CoreAudioSession
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.