There are no visitor comments on this page
Odio SACD (library)
Intro
The Odio SACD shared library is a decoding engine which takes a Super Audio CD source and extracts a 24-bit high resolution wave file. It handles both DST and DSD streams.
The library reads the following input:
- SACD image files (*.iso)
- Sony DSF files (*.dsf)
- Philips DSDIFF files (*.dff)
Supported output sample rates:
- 88.2kHz
- 176.4kHz
Usage
Compilation
#include <libodiosacd/libodiosacd.h>
Linking
LDFLAGS += -lodiosacd
The API
// 1. FUNCTIONS
bool odiolibsacd_Open(char *sInFile, Area nArea)
// Opens the decoder. You must call this before anything else.
// Parameter sInFile: the path to the media
// Parameter nArea: the disc area to decode
// Returns: TRUE on error, FALSE otherwise
DiscDetails* odiolibsacd_GetDiscDetails()
// Returns information about the disc image.
// Returns: a pointer to a DiscDetails structure
int odiolibsacd_GetTrackCount(Area nArea)
// Returns the track count for the requested area.
// Parameter nArea: the disc area to query
// Returns: -1 on error, the track count otherwise
bool odiolibsacd_Convert(char *sOutDir, int nSampleRate, OnProgress pOnProgress, void *pUserData)
// Start decoding the media.
// Parameter sOutDir: the path to the output directory, or NULL to decode to the source directory
// Parameter nSampleRate: the samplerate of the wave output - must be 88200 or 176400
// Parameter pOnProgress: pointer to a progress callback function, or NULL
// Parameter pUserData: pointer to any user data to pass to the progress callback function, or NULL
// Returns: TRUE on error, FALSE otherwise
void odiolibsacd_Close()
// Closes the decoder. You must call this for every odiolibsacd_Open.
// 2. THE PROGRESS CALLBACK
bool funcName(float fProgress, char *sFilePath, int nTrack, void *pUserData)
// If you pass this to odiolibsacd_Convert, it will be called every 1 second, plus every time an output file has completed.
// Parameter fProgress: the percent completed so far
// Parameter sFilePath: whenever an output file completes, it returns its path, otherwise NULL
// Parameter nTrack: whenever an output file completes, it returns its track number, otherwise -1
// Parameter pUserData: the user data you have passed to odiolibsacd_Convert
// Returns: TRUE to continue, FALSE to calcel decoding
// 3. PRE-DEFINED STRUCTURES
typedef struct
{
char *sAlbumTitle; // The album title, check for empty and NULL
char *sAlbumArtist; // The album artist, check for empty and NULL
char *sAlbumPublisher; // The album publisher, check for empty and NULL
char *sAlbumCopyright; // The album copyright, check for empty and NULL
int nTwoChTracks; // The number of tracks in the stereo area
int nMulChTracks; // The number of tracks in the multichannel area
TrackDetails *lTwoChTrackDetails; // An array of TrackDetails for the stereo area, or NULL if nTwoChTracks is 0
TrackDetails *lMulChTrackDetails; // An array of TrackDetails for the multichannel area, or NULL if nMulChTracks is 0
} DiscDetails;
typedef struct
{
char *sTrackTitle; // The track title, check for empty and NULL
char *sTrackPerformer; // The track performer, check for empty and NULL
int nChannels; // The number of channels
} TrackDetails;
// 4. PRE-DEFINED CONSTANTS
typedef enum
{
AREA_BOTH = 0, // Both areas
AREA_TWOCH = 1, // The stereo area
AREA_MULCH = 2, // The multichannel area
AREA_AUTO = 3 // The multichannel area, if it exists, otherwise the stereo area. If both areas exist and the track counts are not equal, then both areas.
} Area;
API bonus: a Python example
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import ctypes
if __name__ == '__main__':
AREA_TWOCH = 1
AREA_MULCH = 2
AREA_AUTO = 3
class TrackDetails(ctypes.Structure):
_fields_ = [('sTrackTitle', ctypes.c_char_p), ('sTrackPerformer', ctypes.c_char_p), ('nChannels', ctypes.c_int)]
class DiscDetails(ctypes.Structure):
_fields_ = [('sAlbumTitle', ctypes.c_char_p), ('sAlbumArtist', ctypes.c_char_p), ('sAlbumPublisher', ctypes.c_char_p), ('sAlbumCopyright', ctypes.c_char_p), ('nTwoChTracks', ctypes.c_int), ('nMulChTracks', ctypes.c_int), ('lTwoChTrackDetails', ctypes.POINTER(TrackDetails)), ('lMulChTrackDetails', ctypes.POINTER(TrackDetails))]
OnProgress = ctypes.CFUNCTYPE(ctypes.c_bool, ctypes.c_float, ctypes.c_char_p, ctypes.c_int, ctypes.c_void_p)
def onProgress(fProgress, sFilePath, nTrack, pUserData = None):
print(fProgress, sFilePath, nTrack, pUserData)
return True
sInPath = b'/path/to/an/sacd.iso'
sOutPath = b'/path/to/outdir'
nSampleRate = 88200
pOnProgress = OnProgress(onProgress)
pUserData = None
oLibOdioSacd = ctypes.cdll.LoadLibrary('/usr/lib/libodiosacd.so')
bError = oLibOdioSacd.odiolibsacd_Open(sInPath, AREA_AUTO)
oLibOdioSacd.odiolibsacd_GetDiscDetails.restype = ctypes.POINTER(DiscDetails)
pDiscDetails = oLibOdioSacd.odiolibsacd_GetDiscDetails(sInPath).contents
print(pDiscDetails.lTwoChTrackDetails[5].sTrackTitle)
bError = oLibOdioSacd.odiolibsacd_Convert(sOutPath, nSampleRate, pOnProgress, pUserData)
oLibOdioSacd.odiolibsacd_Close()
sys.exit(0)
Installation
Arch > Manjaro > etc.
pamac build libodiosacd
From source
Dependencies [1][2]
- cmake
- glibc
[1] The package names may slightly vary among various Linux flavours
[2] Some Linux flavours package development libraries separately, while some have them as part of the base package.
git clone https://github.com/tari01/libodiosacd.git
cd libodiosacd
mkdir build
cd build
cmake ..
make
sudo make install
Links
Report a bug/request a feature/ask a question
Browse the source code
Comments
If you only wish to leave a comment, do so by using the button at the top of this page.