Setting playback device by executing a batch file / powershell script
Asked Answered
D

8

24

I've got my computer(Windows 7) hooked up to the TV, and i very often change output device for sound between Digital Audio (S/PDIF)(High definition audio device) and my headset (2- Corsair CA-HS1 USB Headset)

I wanna be able to execute a batch/script file who changes this for me so i don't have to "right click volume > playback devices > "Mark output device" and click "set default".

I know it's a luxury problem, but hey, maybe I can learn something from someone?

All help appreciated!

Decussate answered 23/3, 2012 at 11:35 Comment(2)
I'm fairly sure this can be done via WMI, so it should be trivial in PowerShell. I've only found Win32_SoundDevice so far, though, which doesn't really offer anything in that regard.Imprecise
Yeah, that's about how far i came the last time i researched it too. I've been thinking that there must be some kind of software that can record commands beeing done when you for example click "all programs" in the start menu.. that would really be useful..Decussate
H
10

I had the exact same requirement as yourself, and AFTER stumbling across your posting I found the following:

https://web.archive.org/web/20131231034118/http://downloadsquad.switched.com/2010/06/16/windows-7-tip-how-to-change-the-default-audio-device-with-a-hot/

Unfortunately it's not a native Windows function; it requires the download of a small open-source scripting tool called AutoHotKey, but it works nicely and only requires a small amount of memory (1 ~ 2.5Mb)

The script provided in the original article doesn't work for me. It's searching for Enabled/Disabled devices and changing that value, as opposed to changing the default device. I've edited it to switch between 2 default devices now. It works by opening your Sound control panel (mmsys.cpl), then scrolling down the list of playback devices to the second item in the list (that's the {Down 2} part). This is because my Speakers are the second item in my list. It then checks to see if the device is default or not. If not, it sets it as the default and closes the window. If it's already the default, it scrolls down another 2 times and sets that as the default.

So, you'll need to ammend the {Down 2} lines to fit your own list of devices.

 #+a::
Run, mmsys.cpl
WinWait,Sound
ControlSend,SysListView321,{Down 2}
ControlGet, selectedDevice, List, Focused, SysListView321
Loop, Parse, selectedDevice, %A_Tab%
    if a_index <> 3
        continue
    else 
    {
        if A_LoopField <> Default Device
        {
            ControlClick,&Set Default
            ControlClick,OK
            WinWaitClose
            SoundPlay, *-1
            return
        }
        else
        {
            ControlSend,SysListView321,{Down 2}
            ControlClick,&Set Default
            ControlClick,OK
            WinWaitClose
            SoundPlay, *-1
            return
    }       
}
Hortensehortensia answered 21/9, 2012 at 23:49 Comment(2)
FYI I found that after installing AutoHotKey I started to get disconnected from some online games that use the PunkBuster anti-cheat system. I think PB was detecting the use of AutoHotKey and decided this was a vector for exploits. It might have been coincidence, or a false positive that has since been fixed, so mileage may vary.Hortensehortensia
This worked great for me, but the Set Default button in the Sound window will set your default sound device as well as your default communications device. If you want to leave your default communications device alone, replace ControlClick,&Set Default with Send {tab}{tab}{down}{down}{enter}. This will tab over to the Set Default button, open the dropdown menu, select Default Device, and press enter, leaving your communications device intact.Volume
K
26

This is how I set 'Line 1' as the playback device:

start /min "" G:\......\nircmd.exe setdefaultsounddevice "Line 1"

NirCmd is a small command-line utility which you can download that allows you to do some useful tasks without displaying any user interface.

Kp answered 21/4, 2014 at 16:13 Comment(3)
Perfect! NirCmd seems much more robust than UI automation with AutoHotKey. I had to rename one of my playback devices since both were just called "Speakers"Selfness
Works great for my Sony bluetooth headphones: nircmd.exe setdefaultsounddevice "Headphones"Diplegia
Worked perfectly for me. Not sure why this isn't the accepted answer.Haughty
H
10

I had the exact same requirement as yourself, and AFTER stumbling across your posting I found the following:

https://web.archive.org/web/20131231034118/http://downloadsquad.switched.com/2010/06/16/windows-7-tip-how-to-change-the-default-audio-device-with-a-hot/

Unfortunately it's not a native Windows function; it requires the download of a small open-source scripting tool called AutoHotKey, but it works nicely and only requires a small amount of memory (1 ~ 2.5Mb)

The script provided in the original article doesn't work for me. It's searching for Enabled/Disabled devices and changing that value, as opposed to changing the default device. I've edited it to switch between 2 default devices now. It works by opening your Sound control panel (mmsys.cpl), then scrolling down the list of playback devices to the second item in the list (that's the {Down 2} part). This is because my Speakers are the second item in my list. It then checks to see if the device is default or not. If not, it sets it as the default and closes the window. If it's already the default, it scrolls down another 2 times and sets that as the default.

So, you'll need to ammend the {Down 2} lines to fit your own list of devices.

 #+a::
Run, mmsys.cpl
WinWait,Sound
ControlSend,SysListView321,{Down 2}
ControlGet, selectedDevice, List, Focused, SysListView321
Loop, Parse, selectedDevice, %A_Tab%
    if a_index <> 3
        continue
    else 
    {
        if A_LoopField <> Default Device
        {
            ControlClick,&Set Default
            ControlClick,OK
            WinWaitClose
            SoundPlay, *-1
            return
        }
        else
        {
            ControlSend,SysListView321,{Down 2}
            ControlClick,&Set Default
            ControlClick,OK
            WinWaitClose
            SoundPlay, *-1
            return
    }       
}
Hortensehortensia answered 21/9, 2012 at 23:49 Comment(2)
FYI I found that after installing AutoHotKey I started to get disconnected from some online games that use the PunkBuster anti-cheat system. I think PB was detecting the use of AutoHotKey and decided this was a vector for exploits. It might have been coincidence, or a false positive that has since been fixed, so mileage may vary.Hortensehortensia
This worked great for me, but the Set Default button in the Sound window will set your default sound device as well as your default communications device. If you want to leave your default communications device alone, replace ControlClick,&Set Default with Send {tab}{tab}{down}{down}{enter}. This will tab over to the Set Default button, open the dropdown menu, select Default Device, and press enter, leaving your communications device intact.Volume
B
3

To follow up on Dale Newton's post, NirCmd is a great way to do this. On top of that if you pair it with AutoHotKey you can create an executable that will change your devices without opening pesky CMD windows every time you run it. For example, I have two sources that I switch between all the time, one is my headphones and they other is my monitor. For my monitor I created an ahk script that does this:

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir% ;I have nircmd in the same folder as these scripts
Run, nircmd setdefaultsounddevice "Acer X34-8" 1
Run, nircmd setdefaultsounddevice "Acer X34-8" 2

And another for my headphones with the last two lines changed to:

Run, nircmd setdefaultsounddevice "Headset Earphone" 1
Run, nircmd setdefaultsounddevice "Headset Earphone" 2

Afterwards you can compile each ahk script into an exe and bind each exe to a keyboard macro so you can execute them with a couple key presses. Personally I am using a Corsair K95 so I use their software to bind these to my 'G' keys.

Also to note, if you are in your sound preferences you can rename any of the devices to avoid naming conflicts.

Barretter answered 4/6, 2016 at 19:36 Comment(0)
R
3

I had a HDMI device that keeps changing it's name, so none of the existing solutions worked for me.

I eventually ended up with this powershell and use of the NirCmd app.

#File: TV.ps1
$name = "SMART*"

# list active audio playback devices.   (Note for cature devices change Render to Capture)
$device = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\*\" | where {$_."DeviceState" -eq 1} | foreach-object -Process {(Get-ItemPropertyValue -Path ($_.PSPath + "\Properties\") -Name "{a45c254e-df1c-4efd-8020-67d146a850e0},2")} | Where-Object {$_ -like $name}

C:\bin\NIRCMDC setdefaultsounddevice $device 1
C:\bin\NIRCMDC setdefaultsounddevice $device 2
Rhett answered 19/10, 2018 at 23:36 Comment(0)
C
2

As far as I understand there is no way to do this programmatically. This is a deliberate design, since Microsoft does not want applications to override audio setting set by user.

You will find same answer here but if you solutions that manipulate windows you can have a look here.

Commonly answered 24/3, 2012 at 16:51 Comment(1)
It was included in my answer your codeplex project manipulate windows.Commonly
A
2

The following script is written in Windows 7 and uses sendkeys. It is based on other snippets I found but adds to them to ensure selection is consistent and stray windows are not left displayed.

You may want to adjust SleepTime for your system if it still plays up. Call the script using a shortcut with the index of the item you wish to select in the Playback Devices window as first parameter.

You can create a new 'toolbar' on your 'taskbar' to select each device with a single click:

Taskbar toolbar picture

'===============================================================================
'This script uses sendkeys to select the Sound Output device
'First parameter should be the desired device number in 'Playback Devices' list
'===============================================================================
Option Explicit

Const SleepTime = 200

Dim WindSh

'===============================================================================
'MAIN ROTUINE
'===============================================================================
'Check the command line input
if ( Wscript.Arguments.Count <> 1)  then
  MsgBox "You must provide a single integer argument representing the device number", vbinformation + vbokonly, Wscript.ScriptName
  Wscript.Quit 1
elseif ( false = IsNumeric( Wscript.Arguments.Item(0) ) )  then
  MsgBox "The argument provided was not an integer number: " & Wscript.Arguments.Item(0), vbinformation + vbokonly, Wscript.ScriptName
  Wscript.Quit 2
End If

set WindSh = CreateObject("Wscript.Shell")
WindSh.run("control.exe mmsys.cpl")
do while (WindSh.AppActivate("Sound") = false)
  WScript.Sleep SleepTime
loop
WindSh.sendkeys("{DOWN " & Clng( Wscript.Arguments.Item(0) ) & "}")
WScript.Sleep SleepTime
WindSh.sendkeys("{TAB 2}")
WScript.Sleep SleepTime
WindSh.sendkeys("{ENTER}")
WScript.Sleep SleepTime
WindSh.sendkeys("%{F4}")
WScript.Sleep SleepTime
if (WindSh.AppActivate("Sound") = true) then
  WindSh.sendkeys("%{F4}")
end if
Anagoge answered 10/3, 2017 at 9:22 Comment(3)
You can find the system device icons in System32\DDORes.dll: digitalcitizen.life/where-find-most-windows-10s-native-iconsRasp
If your audio outputs aren't configurable you'll need to change "{TAB 2}" to "{TAB 1}". If some of them are but others aren't, you'll need to add another command line parameter and mimic what's done for the "{DOWN "... section.Rasp
Save your script to a file that ends in .vbs, e.g. sound.vbs, put that in a directory, then create a Toolbar subdirectory where you put the shortcuts with the extra arguments (edit properties on the shortcut to set the parameters and change the icon), then right-click on the taskbar -> Toolbars -> New Toolbar, navigate to your new Toolbar subdirectory, that creates the new toolbar. Then right-click on it to not show the text or title, and voila!Rasp
S
0

Might not be related to switching the audio device around via script, but I also have my computer hooked up to my TV via HDMI.

When I want to watch video files on the TV I use Media Player Classic Home Cinema - this lets me specify the audio device for MPH:HC in the options without switching over my default sound device on the entire computer.

If your usage is similar to mine maybe MPC:HC will solve your problem for you.

Stole answered 25/3, 2012 at 13:1 Comment(1)
Yeah I'm alreadu dooing so with Winamp and VLC, but I just as often use the TV and speaker system as my computer screens and headset.. :pDecussate
A
0

Note that if you use nircmd setdefaultsounddevice speakers in an enterprise or educational environment login script, the sound will still come out from the speakers when headphones are plugged in.

Addressograph answered 6/3, 2017 at 23:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.