Beating on OpenAL, then giving up. Microsoft wins.

Progress for today

  • Copied the OpenAL SDK out of the ProgramFiles(x86) directory where the installer put it and put it in my menagerie of API test code
  • Converted the MSVC 2005 project to 2010
  • Tried to compile, but the target names didn’t match. Adjusted the output name in the Properties->Configuration Properties->Linker->General->Output File field from PlayMultiChannelWin32.exe to PlayMultiChannel.exe. 
  • Compiled and ran in debug mode, but got the same problem where the audio is going to the 3 front speakers.
  • Since all else has failed, I’m going to RTFM. In OpenAL 1.1 SDK/docs is a collection of documents. Going to start with the OpenAL Programmer’s Guide.
  • So this is really weird. I’m looking through the code to see how the channels are activated, and there doesn’t seem to be anything explicit. But I do find where the wav files are stored. Listening to these samples in windows media player, the correct Dolby channels are selected for 5.1 and 7.1. It seems as though OpenAl is flattening the information to the front three channels. Wile poking around on the OpenAL website, I came across the following regarding Vista:
    • With Microsoft’s decision to remove the audio hardware layer in Windows Vista, legacy DirectSound 3D games will no longer use hardware 3D algorithms for audio spatialization. Instead they will have to rely upon the new Microsoft software mixer that is built into Windows Vista. This new software mixer will give the users basic audio support for their old Direct Sound games but since it has no hardware layer, all EAX® effects will be lost, and no individual per-voice processing can be performed using dedicated hardware processing.
    • I think I’m getting “basic” audio support. This explains why the codebase has not been touched since 2008 or so. Looks like a dead end.
  • Moving along, it’s time to try DirectX. The samples I can find online don’t really thrill me, but looking at books on Amazon, I found Programming 2D Games (P2DG), which has a nice section on sound. It’s now sitting in my Kindle Library. Let’s see how that goes.
  • Downloading the DirectX SDK. All 572 MB of it. Last updated in 2010. Why is this making me nervous?
  • Ran the DirectX installer, which blew up, but seems to have installed all the components, and the demos run. The demo games do generate Dolby 7.1 as well, so that’s progress…
  • Following the steps in Chapter 7 (Sound) in P2DG. XACT opend up just fine. Importing wav files from the OpenAL media directory. Interestingly, some .wav files choked as “unrecognizable” Don’t know why…
    xactError
  • Got the sounds imported and playing in XACT and the Audio Console. And considering how much stuff didn’t work today, That’s enough progress to leave on a high note.

When does surround not equal surround?

Apparently when you’re using OpenAL.

There is a multichannel test binary that you can run. (C:\Program Files (x86)\OpenAL 1.1 SDK\samples\bin\win64\PlayMultiChannelWin64.exe). It should run

front left, center, front right, rear right, rear left, and subwoofer.

Instead, it’s running

front left, front right, and center.

I’ve verified that all eight speakers are working in the test app that comes with the drivers. I’ve also verified that the sound is correctly sent using the Control Panel Sound->configure tool. So I’m not sure if it’s OpenAl or something else. Ah well. That’s for tomorrow.

A bit of a new direction

Somewhere in the middle of finals, I realized I had this nice FLTK/OpenGL application I’d written in C++:

It currently calculates and outputs audio commands to an Arduino that in turn talks to MIDI boards for each channel. But if I can use the main CPU’s internal audio capability, then I can have a deeper level of capability, and it works for enough of my current projects that it’s probably worth building some generic capability.

So that means I need a C++ library and API that can be built using the MSVC 2010 IDE. Possible options are:

Final projects are most inconvenient.

Basically, my bandwidth has been exceeded, and this work can be extended into the summer, while finals are due in two weeks. It’s that whole urgent vs. important thing.

Anyway, I did find an interesting piece on Touch Mechanics: Haptic Technology and Perceptual Computing that got written up over at Intel Software. And to make this post look more interesting, I’m going to link in the TedEd talk that most of the article is based on, so you don’t even have to click the link:

Who says you can’t procrastinate productively?

Standard programming mysteries.

I hate it when I’m starting off with an API and the tutorials don’t work.

I was working with the LWJGL OpenAl examples described in earlier posts, and could not get the audio files in the examples to open. The file was there, it could be converted to an InputStream, but when I tried creating a LWJGL WaveData object, the underlying java audio code would throw an error and I’d get a null object.

So since I’m now trying to figure out what gives with the javax.sound.sampled.* system, I might as well see if I can do what I want to do here. So off we go to the Internet once more, looking for examples that work.

The first thing I found was the Oracle Java Sound API documents, which are huge, loaded with theory and very little code. I’m not complaining really, because they look like they will be really useful when I have a little bit of code working. But there needs to be a “Hello, World”.

Which showed up after a bit of searching. There is a website JSResources, put together by two German (?) developers; Florian Bomers and Matthias Pfisterer. It is loaded with examples that seem to work. I’ve just gotten one of their simple examples running with a minimum of fuss. (Here’s the (slightly) modified code).  Since this is straight sound library, we know that we can run all the channels. Now we just need to get from here to there.

Multichannel sound

It was looking like Java3D only handled Mono and stereo, but I just found com.sun.j3d.audioengines.javasound .JavaSoundMixer, It also uses javax.media.j3d.PhysicalEnvironment, which looks like it has built-in head tracking.

Darn it – got my hopes up too soon: “While the sound image created for final output to the playback system is either only mono or stereo, most device driver implementations will mix the left and right image signals generated for each rendered sound source before outputting the final playback image. Each sound source will use N input channels of this internal mixer. Each implemented Java3D audio device driver will have its own limitations and driver-specific characteristics. These include channel availability and usage (during rendering). Methods for querying these device-driver specific characteristics are provided.” (from javax.media.j3d.AudioDevice)

OK, I’m not ready to give up on Java yet. According to this bug report, multichannel support has been working for a while. My two options at this point are OpenAl through the LWJGL folks, and the javax.sound.sampled library.

Because I’d like to show graphically where the sounds are coming from, I’m going to try the LWJGL approach first.

Looks like multichannel support is in OpenAl, but will require care: “The multi-channel extension provides a mechanism to play multi-channel data via OpenAL. A variety of formats are supported. Multi-channel buffers can be attached or queued on a source. Note that when using the “Generic Software” device, the multi-channel buffers are mixed down to a stereo output. On a hardware device (such as the “Generic Hardware” device or a native device), each channel of a buffer requires a hardware voice. So, for example playing a buffer using the AL_FORMAT_51CHN16 format will require 6 free hardware voices. If the hardware resources are unavailable, the call to alSourceQueueBuffers or alSourcei will fail.”


And then there’s Javascript….

It turns out that there is a good deal of work going on in bringing multichannel audio to your browser. Since this *is* the future, it’s not a thing that I want to overlook, but I don’t want to put all that much time into it right now either. So here are some links:

Now, where was I?

Not a good week for development.

The headgear is done, the divers are in, and I was ready to start doing a serious dive into the Java3D sound capabilities (as per Section 2 of the plan “Develop codebase for testing haptic rendering”). Then my father got sick and landed in the hospital for a week. Which kinda shot productivity to hell.

Anyway, I’m picking up the pieces. The (official) java3d.java.net site was down for most of yesterday, so I’ve only just connected to it again. So far I’ve downloaded and installed the AMD64 version of the jar files, hooked up my Eclipse IDE to the J3d-examples subversion repository (https://svn.java.net/svn/j3d-examples~svn).

The downloaded code compiles and runs as an ant file, but the structure doesn’t accommodate Eclipse’s code navigation for some reason. To fix this, I created a new Java project and copied the entire “resources” tree over and the tree that starts under “classes” in the original file. Here’s a screenshot:

J3D project layout

J3D project layout

This still didn’t compile though. I got an “Access restriction on class due to restriction on required library“, which I’ve never seen before. Poking around led me to StackOverflow, where there was this suggestion:

“go to java build path and under Library tab, remove JRE System Library. Then again Add Library –> JRE System Library”

Well, that makes no sense. It is just deleting and re-adding the system library. On the other hand, that’s exactly the kind of senseless thing that fixes weird errors, so I gave it a shot. Worked like a charm.

Anyway, now I’m having problems locating files that are right where the code says they are, but the loader’s can’t find them. Regardless, it’s time to go take care of Dad.