Audacity
Audacity is a single multiple track tool for editing and recording sound. It allows users to manipulate with the soundtracks, change arrangement or fix issues like noise. The user interface of Audacity as shown in Figure 1 is simple; it provides buttons on top like a video recorder. One can also open an existing file into Audacity for listening or making some changes. The recorded sound is shown in a waveform that makes editing very simple and graphical. It also consists tools for clipping portions of the sound and a special tool for volume adjustments. Audacity is easy to learn, has some good tools for advanced users and is free. The original Audacity was written in 1999 at the Carnegie Mellon University by Dominic Mazzoni and released as open source software (Crook).
Figure 1: Screen image of Audacity in action
Audacity Demographics
The demographic population and main target audiences for Audacity are the musicians. Apart from musicians, podcasters, online video creators and educators find the tool useful. The tool provides some useful features for musicians who try to create new songs, beats and would want to play with different combinations of tools. Audacity is useful for post-processing of all types of audio that includes podcasts as well (Crook).
Architectural Style
The initial goal set by Audacity’s developer Dominic Mazzoni was to make the interface discoverable, that means for naïve or new users, it must be intuitive to use. People must be able to use the software all by themselves without a use of a manual.
The Audacity architecture is a layered style where it is created upon a base of several libraries on top of each other. The two most significant libraries inside Audacity are PortAudio and WxWidgets. The former provides an interface for low-level audio while the latter provides the necessary GUI components (Crook).
The Audacity architecture is designed in such a way that only a little code is required to perform the main functions of the tool, and rest all features are optional. Architecture is also shaped by development considerations, time constraints, and resource constraints. For example due as per information from Audacity development team, due to a lack of resources, they have not embedded TCP/IP connections thereby no facility to bypass firewalls.
Figure 2: Layers in Audacity (Crook)
Figure 2 shows a layered structure of Audacity software where at the top are the GUI and AudioIO libraries then below are in the base are the WxWidgets libraries. The scripting are implemented as a single plugin module with a pipe structure. ShuttleGUI is used for making GUI elements and comes at a level between wxWidgets and Audacity (Crook).
Façade / API / Libraries
ShuttleGui has been used by the Audacity developer team to add a façade in front of the wxWidgets layer, thereby giving a much better and clean code.
Audacity software supports Linux Audio Developer’s Simple Plugin API (LADSPA) for dynamically loadable plugin audio effects. The VAMP API for plugins in Audacity analyzes the audio. The third party APIs used in Audacity are PortAudio and wxWidgets for playback and recording.
The other libraries used by Audacity are libFLAC, libogg and libvorbis that provide various compression formats. Due to licensing issues Audacity does not provide a direct conversion to MP3 format; however it can be done through loading an external library which is the LAME or FFmpeg.
Analysis
SOLID
The SOLID (Single Responsibility, Open-closed, Liskov substitution, Interface segregation, and dependency injection) are the first five basic principles of object-oriented programming and design.
Evaluating the design of Audacity, it seems to be following all the five principles. Each of the libraries of Audacity has a single responsibility and are open to extension but closed on modification. The code is designed in a hierarchical manner attesting Liskov substitution, and the code uses many interfaces or libraries for its GUI layer and audio manipulation layer. As per the architecture and design of Audacity, the widgets and libraries used are dependent on abstractions and not concrete implementations, making the code flexible and easy to upgrade.
GRASP
The GRASP (General Responsibility Assignment Software Patterns) are guidelines for the object-oriented design of code. The various patterns and principles under GRASP cover creator, controller patterns, low coupling, high cohesion and polymorphism. Analyzing the code of Audacity, it is evident that most are not all principles of GRASP are followed here. There is low coupling between the different modules. Each of the modules is independent. Audacity itself has few features that are considered to be its main features while most of the others are optional. There has been a use of scripting which is provided separately as a plugin. The libraries used for GUI development are created through abstraction of wxWidget and ShuttleGUI. There is less coupling and high cohesion between different modules as each one works independently. Polymorphic behavior is evident as the tool allows several features for different types of audio input files and audio manipulation activities.
FURPS
Functionality: The functionality of Audacity is very suitable to the task that it undertakes. Audacity is the number software in audio manipulation.
Usability: Audacity has high usability factor, it is much popular amongst musicians, podcasters and people requiring some level of audio manipulation.
Reliability: An audacity is a stable software with high reliability for high-value output.
Performance: Audacity gives an excellent performance level.
Security/Sustainability: Audacity is secure as it does not provide any interaction with TCP/IP network layer
Conclusion
Audacity is a wonderful software tool that creates high value for musicians and people looking for audio manipulation activities. It is robust and has a high level of architecture and design that makes it a very stable tool. Most of the design principles are followed. Audacity review has revealed that the modular structure it has adopted and the layered architecture it follows could make it very extensible software that can be integrated with different modules and new features without any hassles. Audacity has a very smart architecture. It uses its base libraries that have some basic functions that represent its purpose, for everything else including GUI development, export functionalities and some additional features of audio manipulation, it uses third-party libraries. It can be said that Audacity developers did not bother about reinventing the wheel and used what was presently available. Audacity uses abstractions by adding a façade to wxWidgets for keeping a clean application code. The use of scripting languages in Audacity is also smart, where Audacity utilizes full benefits of scripting language like Perl, without maintaining its copy.
The developers of Audacity must also work to include level network capabilities into Audacity over TCP/IP protocol for a new advanced version of Audacity. Audacity has a modular system that can be added with additional features. In the current scenario of cloud-based applications, it would be very much useful if Audacity could explore onto network-based features and enhancements.
Works Cited
Crook, James. "The Architecture Of Open Source Applications: Audacity". Aosabook.org.
Web. 23 Apr. 2016.