COMS6901-008 Projects in Computer Science
Network Audio Library
Authors:
Dirk Bridwell dnbridwell@earthlink.net
Jan Miller janalanmiller@uswest.net
Abstract:
The NAL library is a multi threaded cross plartform audio library for
creating network audio applications. The library is written in C++ and
intended to used by C++ applications. The intention is to have an object-oriented
library which reduces the time and effort needed to create an audio application.
The library includes facilities which ease degugging and performance management
of an application.
Architecture
The NAL Library is subdivided into 5 major areas.
- Audio Devices
- Codecs
- Network
- Common
- NAL Root
For more on the architecture of NAL see the Rational Rose model. It contains the above diagrams as well as details on the classes.
Accomplishments for the spring semester:
-
Researched audio device APIs in order to understand crossplatform issues.
Platforms included the Win32 API, the Open Sound System, Solaris Sound
System, DirectSound (of DirectX), and the sound system of FreeBSD.
-
Created a cross platform abstraction for dealing with devices.
-
Wrote a Win23 audio device layer for Windows use.
-
Wrote an Open Sound System device layer for Linux use.
-
Researched various codecs in order to understand their commonalities.
-
Created an abstract interface for dealing with codecs.
-
Extracted several codecs from RAT including G.711, G.726, IDVI.
-
Created an object oriented interface to RTP.
-
Investigated possible playback algorithms to be added to NAL.
-
Created the necessary infrastructure for managing the project i.e., Visual
C++ Project, Unix autoconf, and a CVS repository.
-
Over 5000 lines of new code written.
-
Over 10,000 total lines of code.
Plans for the summer semester:
These plans are in priority order. Items will be attempted as time permits.
-
Create testing harnasses for each sub component of the library implemented
now (audio devices, codecs, and RTP).
-
Use the delay testing code to check for the audio delay created by the
devices.
-
Tie the testing harnesses together into a small application to prove that
the components implemented now are working together.
-
Create a playout buffer alogrithms.
-
Integrate and test the playout buffer algorithms.
-
Add ACM functionality.
-
Add a Solaris device.
-
Add a FreeBSD device.
-
Add a DirectX device.
-
Test on as many different computers as possible (various Window machines,
Linux mahcines, and a couple of Solaris boxes).
System Requirements:
The library requires Visual C++ and Windows to compile on Windows. Autoconf,
gcc, and g++ are needed to compile on various UNIX machines. Audio devices
supported by the platform should work with the library.
Installation Insrtuctions:
to be written...
Configuration:
to be written....
Operation:
to be written...
Program Internal Operation:
to be written...
Broken Things and Restrictions:
to be written...
Suggested Enhancments:
more devices
more codecs
more transports
...
Acknowledgements:
Henning Schulzrinne
-
Nevot for understanding of audio application design.
-
Playout algorithm design using Forward Error Correction.
RAT from University College in London
-
Ideas for system structure.
-
Device implementation semantics.
-
Codec format structure.
-
Audio data formats and structure.
Sun Microsystems
Stichting Mathematisch Centrum, Amstredam, The Netherlands
4Front Technologies:
-
The Open Sound System documentation.
Microsoft Corporation:
Speak Easy:
-
Audio application design.
Comments:
At the beginning of this project we did not really understand the scope
of the project. Most of the concepts and necessary knowledge has had to
be gained through research, reading documentation, and experimentation.
It turns out that creating a robust cross platform audio device abstraction
alone is quite a chore. The code that does exist seems to be tangled
up within an audio application. Codec code also seems to be mixed in with
applications or proprietary. The bottom line seems to be that there is
a lot of code out there, but not much good information. We have had to
balance exposing the complexity of a large number of capabilities of various
platforms and creating something that is easy to use. We think the progress
made up to now is pretty good considering the complexity of the task.