/** @brief audio-decoder - wrapper around libsndfile and libav* @file ad.h @author Robin Gareus Copyright (C) 2011-2013 Robin Gareus This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser Public License as published by the Free Software Foundation; either version 2.1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __AD_H__ #define __AD_H__ #include #include struct adinfo { unsigned int sample_rate; unsigned int channels; int64_t length; //milliseconds int64_t frames; //total number of frames (eg a frame for 16bit stereo is 4 bytes). int bit_rate; int bit_depth; char * meta_data; }; /* global init function - register codecs */ void ad_init(); /* --- public API --- */ /** open an audio file * @param fn file-name * @param nfo pointer to a adinfo struct which will hold information about the file. * @return NULL on error, a pointer to an opaque soundfile-decoder object on success. */ void * ad_open (const char *fn, struct adinfo *nfo); /** close an audio file and release decoder structures * @param sf decoder handle * @return 0 on succees, -1 if sf was invalid or not open (return value can usually be ignored) */ int ad_close (void *sf); /** seel to a given position in the file * @param sf decoder handle * @param pos frame position to seek to in frames (1 frame = number-of-channel samples) from the start of the file. * @return the current position in frames (multi-channel samples) from the start of the file. On error this function returns -1. */ int64_t ad_seek (void *sf, int64_t pos); /** decode audio data chunk to raw interleaved channel floating point data * * @param sf decoder handle * @param out place to store data -- must be large enough to hold (sizeof(float) * len) bytes. * @param len number of samples (!) to read (should be a multiple of nfo->channels). * @return the number of read samples. */ ssize_t ad_read (void *sf, float* out, size_t len); /** re-read the file information and meta-data. * * this is not neccesary in general \ref ad_open includes an inplicit call * but meta-data may change in live-stream in which case en explicit call to * ad_into is needed to update the inforation * * @param fn file-name * @param nfo pointer to a adinfo struct which will hold information about the file. * @return 0 on succees, -1 if sf was invalid or not open */ int ad_info (void *sf, struct adinfo *nfo); /** zero initialize the information struct. * (does not free nfo->meta_data) * @param nfo pointer to a adinfo struct */ void ad_clear_nfo (struct adinfo *nfo); /** free possibly allocated meta-data text * @param nfo pointer to a adinfo struct */ void ad_free_nfo (struct adinfo *nfo); /* --- helper functions --- */ /** read file info * combines ad_open() and ad_close() */ int ad_finfo (const char *, struct adinfo *); /** * wrapper around \ref ad_read, downmixes all channels to mono */ ssize_t ad_read_mono_dbl (void *, struct adinfo *, double*, size_t); /** * calls dbg() to print file info to stderr. * * @param dbglvl * @param nfo */ void ad_dump_nfo (int dbglvl, struct adinfo *nfo); /** set audio-decoder debug level -- all info is printed to stderr. * * @param lvl debug-level threshold * -1: absolutley silent * 0: errors only * 1: errors + info * 2: + debug * 3: + low-level-debug info */ void ad_set_debuglevel(int lvl); #endif