- Undocumented Matlab - https://undocumentedmatlab.com -
Updating speaker sound volume
Posted By Yair Altman On October 15, 2009 | 9 Comments
In a recent CSSM forum post [1], a reader asked whether it is possible to get and/or set the system speaker sound volume programmatically. The purpose would be to connect this programming snippet to a GUI control that would allow users to increase/decrease playback volume in the same GUI window as the other playback controls.
This is apparently not possible with documented Matlab functions: we can modify specific playback files, but not the speaker in general. However, it is possible using standard Java calls. Note that I am specifically not mentioning the word undocumented here. The reason is that these Java calls can all be achieved using Matlab’s documented, although mostly unknown, Java interface.
Today, I have submitted a new utility to the Matlab File Exchange, called SoundVolume [2]. SoundVolume enables getting and setting the speaker volume programmatically. For the benefit of users, here is the core of the program (the actual program contains extra sanity checks and exception handling):
function volume = SoundVolume(volume)
% Loop over the system's mixers to find the speaker port
import javax.sound.sampled.*
mixerInfos = AudioSystem.getMixerInfo;
foundFlag = 0;
for mixerIdx = 1 : length(mixerInfos)
mixer = AudioSystem.getMixer(mixerInfos(mixerIdx));
ports = getTargetLineInfo(mixer);
for portIdx = 1 : length(ports)
port = ports(portIdx);
try
portName = port.getName; % better
catch %#ok
portName = port.toString; % sub-optimal
end
if ~isempty(strfind(lower(char(portName)),'speaker'))
foundFlag = 1; break;
end
end
end
if ~foundFlag
error('Speaker port not found');
end
% Get and open the speaker port's Line object
line = AudioSystem.getLine(port);
line.open();
% Loop over the Line's controls to find the Volume control
ctrls = line.getControls;
foundFlag = 0;
for ctrlIdx = 1 : length(ctrls)
ctrl = ctrls(ctrlIdx);
ctrlName = char(ctrls(ctrlIdx).getType);
if ~isempty(strfind(lower(ctrlName),'volume'))
foundFlag = 1; break;
end
end
if ~foundFlag
error('Volume control not found');
end
% Get or set the volume value according to the user request
oldValue = ctrl.getValue;
if nargin
ctrl.setValue(volume);
end
if nargout
volume = oldValue;
end
Note that our Matlab code could have been much simpler, following the examples provided here [3] and here [4]. Unfortunately, Matlab prevents using Java classnames containing a period (e.g., Port.Info) or static Interface values, so we cannot directly access Port.Info.SPEAKER or FloatControl.Type.VOLUME. I’ve reported this bug to Mathworks earlier this year, and I do not know in which Matlab release (if at all) they intend to fix it. Until then we need to use workarounds, as in the code above. I posted a similar issue (and its workaround) earlier in this blog, when setting system-tray popup message [5].
For more information about accessing Java’s extensive sound-related functionality, read Sun’s official Java sound documentation trail [6].
Categories: GUI, Java, Low risk of breaking in future versions
Article printed from Undocumented Matlab: https://undocumentedmatlab.com
URL to article: https://undocumentedmatlab.com/articles/updating-speaker-sound-volume
URLs in this post:
[1] recent CSSM forum post: https://www.mathworks.com/matlabcentral/newsreader/view_thread/261909
[2] SoundVolume: http://www.mathworks.com/matlabcentral/fileexchange/25584
[3] here: http://forums.sun.com/thread.jspa?messageID=10736264#10736264
[4] here: http://forums.sun.com/thread.jspa?threadID=5262210
[5] setting system-tray popup message: http://undocumentedmatlab.com/blog/setting-system-tray-popup-messages/
[6] official Java sound documentation trail: http://java.sun.com/docs/books/tutorial/sound/
[7] Waiting for asynchronous events : https://undocumentedmatlab.com/articles/waiting-for-asynchronous-events
[8] Extending a Java class with UDD : https://undocumentedmatlab.com/articles/extending-a-java-class-with-udd
[9] Customizing figure toolbar background : https://undocumentedmatlab.com/articles/customizing-figure-toolbar-background
[10] Setting system tray popup messages : https://undocumentedmatlab.com/articles/setting-system-tray-popup-messages
[11] Uicontrol callbacks : https://undocumentedmatlab.com/articles/uicontrol-callbacks
[12] Tab panels – uitab and relatives : https://undocumentedmatlab.com/articles/tab-panels-uitab-and-relatives
Click here to print.
Copyright © Yair Altman - Undocumented Matlab. All rights reserved.