0

History & Situation:

I'm currently working on updating a Java application that was developed for a client several years ago (to run on WinXP) and is used for testing and training people with certain hearing impairments. Users who bought this application were provided with a particular USB sound device and headphones.

One of the most important requirements for this software is that the audio must be played to the user at specific decibel sound levels. Using the Java Sound API, the application was developed to dynamically adjust the Windows Volume to calculated levels (based on measurements made when calibrating the USB sound device & headphones during development).

Problem:

The application now needs to be upgraded to support Windows Vista and Windows 7, however due to Windows' new per-app sound architecture, I've been unable to find any way to access the Master/System volume using the Java Sound API.

The application's windows volume control alone doesn't cut it since it's relative to the system volume and there's no way to guarantee that the user will hear the output audio at a specific, known level.

Does anybody know if it is even possible to do this in Java and if so then how? If it's not possible, then can you give any guidance on what might be the simplest way to achieve it? (JNI and C perhaps - though I've never used JNI before... any gotchas to be aware of?)

lethek
  • 445
  • 6
  • 14

2 Answers2

2

If you run your application in Windows XP compatibility mode, it should work (it depends on how the Java Sound API interacts with the hardware volume).

If you want to use the Vista (and beyond) sound APIs, you want to look at the IAudioEndpointVolume API.

Larry Osterman
  • 16,086
  • 32
  • 60
  • Thanks :D I don't know why I didn't think to try it in Win XP compatibility mode, but it works perfectly if I enable that option. – lethek Nov 16 '09 at 01:25
0

My guess is since you're using an USB device, your Java sound API does not access the correct channel.

You can have a look at how to adjust the master volume in Windows XP. I know you aren't working in XP but have a look at how to access specific Lines and Mixers on that link. You may have to experiment a bit to find the correct line and mixer combination, or offer your users a GUI that allows them to choose the correct line and mixer combination.

I've run applications that work with this method in Windows 7 so I doubt that it's an O compatibility issue.

Garg Unzola
  • 376
  • 1
  • 4
  • 9
  • 1
    If memory serves me correctly, it wasn't a problem or wrong channel/line/mixer: the problem was that the API didn't provide any way to adjust the device's master volume for the "entire system" in Vista/7 - it's only changing the volume for the specific app, which is then influenced by the system's real master volume for the device (that you can't control or measure). – lethek Apr 27 '11 at 04:25
  • E.g. manually set the system volume to 50% in the Windows Mixer, then set the "master" from your application to 100% and try it out. Then try again, manually setting the system volume to something else. You'll see they're 2 completely separate, but dependent, volume controls and you cannot access the system's master from your app – lethek Apr 27 '11 at 04:31