git clone 'https://github.com/Shirakumo/cl-mpg123.git'
This is a bindings and wrapper library to libmpg123 allowing for convenient, extensive, and fast decoding of MPEG1/2/3 (most prominently mp3) files.
Precompiled versions of the underlying library are included in this. If you want to build it manually however, refer to the mpg123 page.
Load the system through ASDF or Quicklisp:
Create a new
(defvar *file* (cl-mpg123:make-file #p"~/my-cool-music.mp3"))
This will initialise a file and set the requested parameters. As it is now, we've left everything up to defaults. If you need more tailored control as to how the file will be treated, see the
file class documentation. Next we will want to actually open up the underlying file so that we can look into it.
Processing the actual sound data, is just a matter of calling
process and passing the
buffer to something that can do something useful with the raw audio data. However, unless you specifically chose the audio data format yourself, you'll first want to query that:
This will give you the rate, channels, and encoding of the file so that you can configure your audio processing library accordingly. Next we can process the data in a loop:
(loop with buffer = (cl-mpg123:buffer *file*) for bytes = (cl-mpg123:process *file*) until (= 0 bytes) do (process-buffer-somehow buffer bytes))
This library is also capable of extracting ID3 tags from the file. A quick summary of information found in a file can be displayed with
Direct access to the metadata object is possible with
metadata. This object will then allow you to retrieve the values of various tags through
(cl-mpg123:field-text :album (metadata *file*))
For the list of possible field names, see
*id3v2-type-map. For a listing of all recognised tags, simply use
fields on the
metadata object. If possible, picture tags are also extracted and converted. You can get your hands on those through the
pictures reader. Returned are a list of
picture objects that will encapsulate the data.
Should you wish to change parameters for the decoding or the file itself, you can do so via
reinitialize-instance. Just be aware that doing so will close the handle and is thus not recommended during processing.
Also included in
libmpg123 are volume changing and a full 32 band equalizer. The volume can be accessed by, naturally,
volume, and the equalizer by
(setf (cl-mpg123:volume *file*) 0.5) (cl-mpg123:volume *file*)
You can also seek around in the file if necessary. Doing so is done by the single
seek function which allows you to seek by samples, frames, or track seconds, either relatively, absolutely, or from the end of the file.
(cl-mpg123:seek *file* 1 :by :second)
Once you know you are done with the file, you can
disconnect it to release the underlying file descriptor. Once the file is GCed, its handler and buffer will automatically be freed so that there's no worry about permanent memory leaks.
And that's about it. See the individual functions for more information on what exactly you can get or change. If you want to look at a full example that actually plays something, see the
cl-mpg123-example system, which shows how to use it in combination with
cl-out123 using either the low-level binding interface, or the high-level wrapper interface shown here.