Undocumented Matlab
  • SERVICES
    • Consulting
    • Development
    • Training
    • Gallery
    • Testimonials
  • PRODUCTS
    • IQML: IQFeed-Matlab connector
    • IB-Matlab: InteractiveBrokers-Matlab connector
    • EODML: EODHistoricalData-Matlab connector
    • Webinars
  • BOOKS
    • Secrets of MATLAB-Java Programming
    • Accelerating MATLAB Performance
    • MATLAB Succinctly
  • ARTICLES
  • ABOUT
    • Policies
  • CONTACT
  • SERVICES
    • Consulting
    • Development
    • Training
    • Gallery
    • Testimonials
  • PRODUCTS
    • IQML: IQFeed-Matlab connector
    • IB-Matlab: InteractiveBrokers-Matlab connector
    • EODML: EODHistoricalData-Matlab connector
    • Webinars
  • BOOKS
    • Secrets of MATLAB-Java Programming
    • Accelerating MATLAB Performance
    • MATLAB Succinctly
  • ARTICLES
  • ABOUT
    • Policies
  • CONTACT

Updating speaker sound volume

October 15, 2009 9 Comments

In a recent CSSM forum post, 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. 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

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 and here. 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.
For more information about accessing Java’s extensive sound-related functionality, read Sun’s official Java sound documentation trail.

Related posts:

  1. Waiting for asynchronous events – The Matlab waitfor function can be used to wait for asynchronous Java/ActiveX events, as well as with timeouts. ...
  2. Extending a Java class with UDD – Java classes can easily be extended in Matlab, using pure Matlab code. ...
  3. Customizing figure toolbar background – Setting the figure toolbar's background color can easily be done using just a tiny bit of Java magic powder. This article explains how. ...
  4. Setting system tray popup messages – System-tray icons and messages can be programmatically set and controlled from within Matlab, using new functionality available since R2007b....
  5. Uicontrol callbacks – This post details undocumented callbacks exposed by the underlying Java object of Matlab uicontrols, that can be used to modify the control's behavior in a multitude of different events...
  6. Tab panels – uitab and relatives – This article describes several undocumented Matlab functions that support tab-panels...
Java
Print Print
« Previous
Next »
Leave a Reply
HTML tags such as <b> or <i> are accepted.
Wrap code fragments inside <pre lang="matlab"> tags, like this:
<pre lang="matlab">
a = magic(3);
disp(sum(a))
</pre>
I reserve the right to edit/delete comments (read the site policies).
Not all comments will be answered. You can always email me (altmany at gmail) for private consulting.

Click here to cancel reply.

Useful links
  •  Email Yair Altman
  •  Subscribe to new posts (feed)
  •  Subscribe to new posts (reader)
  •  Subscribe to comments (feed)
 
Accelerating MATLAB Performance book
Recent Posts

Speeding-up builtin Matlab functions – part 3

Improving graphics interactivity

Interesting Matlab puzzle – analysis

Interesting Matlab puzzle

Undocumented plot marker types

Matlab toolstrip – part 9 (popup figures)

Matlab toolstrip – part 8 (galleries)

Matlab toolstrip – part 7 (selection controls)

Matlab toolstrip – part 6 (complex controls)

Matlab toolstrip – part 5 (icons)

Matlab toolstrip – part 4 (control customization)

Reverting axes controls in figure toolbar

Matlab toolstrip – part 3 (basic customization)

Matlab toolstrip – part 2 (ToolGroup App)

Matlab toolstrip – part 1

Categories
  • Desktop (45)
  • Figure window (59)
  • Guest bloggers (65)
  • GUI (165)
  • Handle graphics (84)
  • Hidden property (42)
  • Icons (15)
  • Java (174)
  • Listeners (22)
  • Memory (16)
  • Mex (13)
  • Presumed future risk (394)
    • High risk of breaking in future versions (100)
    • Low risk of breaking in future versions (160)
    • Medium risk of breaking in future versions (136)
  • Public presentation (6)
  • Semi-documented feature (10)
  • Semi-documented function (35)
  • Stock Matlab function (140)
  • Toolbox (10)
  • UI controls (52)
  • Uncategorized (13)
  • Undocumented feature (217)
  • Undocumented function (37)
Tags
ActiveX (6) AppDesigner (9) Callbacks (31) Compiler (10) Desktop (38) Donn Shull (10) Editor (8) Figure (19) FindJObj (27) GUI (141) GUIDE (8) Handle graphics (78) HG2 (34) Hidden property (51) HTML (26) Icons (9) Internal component (39) Java (178) JavaFrame (20) JIDE (19) JMI (8) Listener (17) Malcolm Lidierth (8) MCOS (11) Memory (13) Menubar (9) Mex (14) Optical illusion (11) Performance (78) Profiler (9) Pure Matlab (187) schema (7) schema.class (8) schema.prop (18) Semi-documented feature (6) Semi-documented function (33) Toolbar (14) Toolstrip (13) uicontrol (37) uifigure (8) UIInspect (12) uitools (20) Undocumented feature (187) Undocumented function (37) Undocumented property (20)
Recent Comments
  • Sunham (2 days 18 hours ago): This is an old article, but the issue persists even in 2023. 2023a: z = mat2cell(1:1e6,1,repmat(1,1,1e 6)); f = @() cellfun(‘isempty’, z); g = @() cellfun(@isempty,z);...
  • Yair Altman (12 days 8 hours ago): Robot only runs when you tell it to run a command such as keyPress. If you don’t tell it to run a command, it uses no CPU, so there’s no need to remove the Robot...
  • Eric (12 days 20 hours ago): Hey @Kevin, can you share your code about create group of figures in the AppContainer? The container of multiples uifigures could be an amazing improvement over AppDesigner and its...
  • Elsa Smith (13 days 10 hours ago): I recently used java.awt.Robot to perform GUI testing on MATLAB and found it to be an extremely easy and useful way to control mouse movements.
  • Elsa Smith (13 days 11 hours ago): I’m suspecting that the slow performance of my GUI may be due to the use of java.awt.Robot. Is there a way to cancel/stop/remove the robot after it has been created, or is...
  • Michelle Kline (14 days 4 hours ago): *edit* tip about fopen(), not about fwrite(). ‘Wb’ vs. ‘wb’
  • Michelle Kline (14 days 4 hours ago): Thank you, Yair! With this previously-unknown-to-me tip about fwrite() performance, you have saved me literally hours of processing time. Michelle Kline Department of...
  • Alessandro Beda (26 days 16 hours ago): I found what I think is a bug related to this (tested in R2022 and R2023a). If I add a “ButtonDownFcn” to the plots (see example below), then the modified...
  • Nicholas (28 days 6 hours ago): Yair, Changing the desktop help options did not solve the issue. Though, it’s unclear how I could change these options in the Runtime, if that’s what you meant? I should...
  • Yair Altman (32 days 1 hour ago): @Francisco – this is one of those cases where you should ask MathWorks support. After all, you’re trying to use a supported Matlab functionality when you encountered...
  • Francisco Campos (32 days 13 hours ago): Hello, thanks for all your work that has been immensely useful for those working in the Matlab environment. I have been trying to replace matlabcontrol with the official...
  • Yair Altman (36 days 14 hours ago): Kei – this is possible, I believe that I saw this ability somewhere, a few years ago. I don’t remember exactly where, it will require a bit of research, but...
  • Kei (36 days 17 hours ago): Hello Yair Thank you for this great article. I would like to freeze first two columns in uitable. Do you know if such option is available? Since looks like this option is not available...
  • Andrés Aguilar (40 days 4 hours ago): Hello, has anyone tried to change the language of the DateComboBox? For example English -> French ————&# 8212;—- January -> Janvier April...
  • Yair Altman (49 days 2 hours ago): I posted my treeTable utility 10 years ago for anyone to use freely, on an as-is basis, without any warranty, updates or support. If you need any customization or assistance...
Contact us
Captcha image for Custom Contact Forms plugin. You must type the numbers shown in the image
Undocumented Matlab © 2009 - Yair Altman
This website and Octahedron Ltd. are not affiliated with The MathWorks Inc.; MATLAB® is a registered trademark of The MathWorks Inc.
Scroll to top