本文整理汇总了C++中DB_decoder_t类的典型用法代码示例。如果您正苦于以下问题:C++ DB_decoder_t类的具体用法?C++ DB_decoder_t怎么用?C++ DB_decoder_t使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了DB_decoder_t类的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: _rg_write_meta
static int
_rg_write_meta (DB_playItem_t *track) {
const char *path = NULL;
const char *decoder_id = NULL;
deadbeef->pl_lock ();
path = strdupa (deadbeef->pl_find_meta_raw (track, ":URI"));
int is_subtrack = deadbeef->pl_get_item_flags (track) & DDB_IS_SUBTRACK;
if (is_subtrack) {
trace ("rg_scanner: Can't write to subtrack of file: %s\n", path);
deadbeef->pl_unlock ();
return -1;
}
decoder_id = deadbeef->pl_find_meta_raw (track, ":DECODER");
if (!decoder_id) {
trace ("rg_scanner: Invalid decoder in track %s\n", path);
deadbeef->pl_unlock ();
return -1;
}
decoder_id = strdupa (decoder_id);
int match = track && decoder_id;
deadbeef->pl_unlock ();
if (match) {
int is_subtrack = deadbeef->pl_get_item_flags (track) & DDB_IS_SUBTRACK;
if (is_subtrack) {
return 0; // only write tags for actual tracks
}
// find decoder
DB_decoder_t *dec = NULL;
DB_decoder_t **decoders = deadbeef->plug_get_decoder_list ();
for (int i = 0; decoders[i]; i++) {
if (!strcmp (decoders[i]->plugin.id, decoder_id)) {
dec = decoders[i];
if (dec->write_metadata) {
if (dec->write_metadata (track)) {
trace ("rg_scanner: Failed to write tag to %s\n", path);
return -1;
}
}
else {
trace ("rg_scanner: Writing tags is not supported for the file %s\n", path);
}
break;
}
}
}
else {
trace ("rg_scanner: Could not find matching decoder for %s\n", path);
return -1;
}
return 0;
}
示例2: write_meta_worker
static void
write_meta_worker (void *ctx) {
for (int t = 0; t < numtracks; t++) {
if (progress_aborted) {
break;
}
DB_playItem_t *track = tracks[t];
deadbeef->pl_lock ();
const char *dec = deadbeef->pl_find_meta_raw (track, ":DECODER");
char decoder_id[100];
if (dec) {
strncpy (decoder_id, dec, sizeof (decoder_id));
}
int match = track && dec;
deadbeef->pl_unlock ();
if (match) {
int is_subtrack = deadbeef->pl_get_item_flags (track) & DDB_IS_SUBTRACK;
if (is_subtrack) {
continue;
}
deadbeef->pl_item_ref (track);
g_idle_add (set_progress_cb, track);
// find decoder
DB_decoder_t *dec = NULL;
DB_decoder_t **decoders = deadbeef->plug_get_decoder_list ();
for (int i = 0; decoders[i]; i++) {
if (!strcmp (decoders[i]->plugin.id, decoder_id)) {
dec = decoders[i];
if (dec->write_metadata) {
dec->write_metadata (track);
}
break;
}
}
}
}
g_idle_add (write_finished_cb, ctx);
}
示例3: convert
int
convert (DB_playItem_t *it, const char *out, int output_bps, int output_is_float, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort) {
char *buffer = NULL;
char *dspbuffer = NULL;
if (deadbeef->pl_get_item_duration (it) <= 0) {
deadbeef->pl_lock ();
fprintf (stderr, "converter: stream %s doesn't have finite length, skipped\n", deadbeef->pl_find_meta (it, ":URI"));
deadbeef->pl_unlock ();
return -1;
}
int err = -1;
FILE *enc_pipe = NULL;
int temp_file = -1;
DB_decoder_t *dec = NULL;
DB_fileinfo_t *fileinfo = NULL;
char input_file_name[PATH_MAX] = "";
deadbeef->pl_lock ();
dec = (DB_decoder_t *)deadbeef->plug_get_for_id (deadbeef->pl_find_meta (it, ":DECODER"));
deadbeef->pl_unlock ();
if (dec) {
fileinfo = dec->open (0);
if (fileinfo && dec->init (fileinfo, DB_PLAYITEM (it)) != 0) {
deadbeef->pl_lock ();
fprintf (stderr, "converter: failed to decode file %s\n", deadbeef->pl_find_meta (it, ":URI"));
deadbeef->pl_unlock ();
goto error;
}
if (fileinfo) {
if (output_bps == -1) {
output_bps = fileinfo->fmt.bps;
output_is_float = fileinfo->fmt.is_float;
}
char *final_path = strdupa (out);
char *sep = strrchr (final_path, '/');
if (sep) {
*sep = 0;
if (!check_dir (final_path, 0755)) {
fprintf (stderr, "converter: failed to create output folder: %s\n", final_path);
goto error;
}
}
if (encoder_preset->method == DDB_ENCODER_METHOD_FILE) {
const char *tmp = getenv ("TMPDIR");
if (!tmp) {
tmp = "/tmp";
}
snprintf (input_file_name, sizeof (input_file_name), "%s/ddbconvXXXXXX", tmp);
char *res = mktemp (input_file_name);
strcat (input_file_name, ".wav");
}
else {
strcpy (input_file_name, "-");
}
char enc[2000];
memset (enc, 0, sizeof (enc));
char escaped_out[PATH_MAX];
escape_filepath (out, escaped_out, sizeof (escaped_out));
// formatting: %o = outfile, %i = infile
char *e = encoder_preset->encoder;
char *o = enc;
*o = 0;
int len = sizeof (enc);
while (e && *e) {
if (len <= 0) {
fprintf (stderr, "converter: failed to assemble encoder command line - buffer is not big enough, try to shorten your parameters. max allowed length is %u characters\n", (unsigned)sizeof (enc));
goto error;
}
if (e[0] == '%' && e[1]) {
if (e[1] == 'o') {
int l = snprintf (o, len, "\"%s\"", escaped_out);
o += l;
len -= l;
}
else if (e[1] == 'i') {
int l = snprintf (o, len, "\"%s\"", input_file_name);
o += l;
len -= l;
}
else {
strncpy (o, e, 2);
o += 2;
len -= 2;
}
e += 2;
}
else {
*o++ = *e++;
*o = 0;
len--;
}
}
fprintf (stderr, "converter: will encode using: %s\n", enc[0] ? enc : "internal RIFF WAVE writer");
//.........这里部分代码省略.........
示例4: convert
int
convert (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort) {
if (deadbeef->pl_get_item_duration (it) <= 0) {
deadbeef->pl_lock ();
const char *fname = deadbeef->pl_find_meta (it, ":URI");
fprintf (stderr, "converter: stream %s doesn't have finite length, skipped\n", fname);
deadbeef->pl_unlock ();
return -1;
}
char *path = outfolder[0] ? strdupa (outfolder) : strdupa (getenv("HOME"));
if (!check_dir (path, 0755)) {
fprintf (stderr, "converter: failed to create output folder: %s\n", outfolder);
return -1;
}
int err = -1;
FILE *enc_pipe = NULL;
FILE *temp_file = NULL;
DB_decoder_t *dec = NULL;
DB_fileinfo_t *fileinfo = NULL;
char out[PATH_MAX] = ""; // full path to output file
char input_file_name[PATH_MAX] = "";
dec = (DB_decoder_t *)deadbeef->plug_get_for_id (deadbeef->pl_find_meta (it, ":DECODER"));
if (dec) {
fileinfo = dec->open (0);
if (fileinfo && dec->init (fileinfo, DB_PLAYITEM (it)) != 0) {
deadbeef->pl_lock ();
fprintf (stderr, "converter: failed to decode file %s\n", deadbeef->pl_find_meta (it, ":URI"));
deadbeef->pl_unlock ();
goto error;
}
if (fileinfo) {
if (output_bps == -1) {
output_bps = fileinfo->fmt.bps;
output_is_float = fileinfo->fmt.is_float;
}
get_output_path (it, outfolder, outfile, encoder_preset, out, sizeof (out));
if (encoder_preset->method == DDB_ENCODER_METHOD_FILE) {
const char *tmp = getenv ("TMPDIR");
if (!tmp) {
tmp = "/tmp";
}
snprintf (input_file_name, sizeof (input_file_name), "%s/ddbconvXXXXXX", tmp);
mktemp (input_file_name);
strcat (input_file_name, ".wav");
}
else {
strcpy (input_file_name, "-");
}
char enc[2000];
memset (enc, 0, sizeof (enc));
// formatting: %o = outfile, %i = infile
char *e = encoder_preset->encoder;
char *o = enc;
*o = 0;
int len = sizeof (enc);
while (e && *e) {
if (len <= 0) {
fprintf (stderr, "converter: failed to assemble encoder command line - buffer is not big enough, try to shorten your parameters. max allowed length is %u characters\n", (unsigned)sizeof (enc));
goto error;
}
if (e[0] == '%' && e[1]) {
if (e[1] == 'o') {
int l = snprintf (o, len, "\"%s\"", out);
o += l;
len -= l;
}
else if (e[1] == 'i') {
int l = snprintf (o, len, "\"%s\"", input_file_name);
o += l;
len -= l;
}
else {
strncpy (o, e, 2);
o += 2;
len -= 2;
}
e += 2;
}
else {
*o++ = *e++;
*o = 0;
len--;
}
}
fprintf (stderr, "converter: will encode using: %s\n", enc[0] ? enc : "internal RIFF WAVE writer");
if (!encoder_preset->encoder[0]) {
// write to wave file
temp_file = fopen (out, "w+b");
if (!temp_file) {
fprintf (stderr, "converter: failed to open output wave file %s\n", out);
goto error;
}
//.........这里部分代码省略.........
示例5: rg_calc_thread
void
rg_calc_thread(void *ctx) {
DB_decoder_t *dec = NULL;
DB_fileinfo_t *fileinfo = NULL;
char *buffer = NULL;
char *bufferf = NULL;
track_state_t *st = (track_state_t *)ctx;
if (st->settings->pabort && *(st->settings->pabort)) {
return;
}
if (deadbeef->pl_get_item_duration (st->settings->tracks[st->track_index]) <= 0) {
st->settings->results[st->track_index].scan_result = DDB_RG_SCAN_RESULT_INVALID_FILE;
return;
}
deadbeef->pl_lock ();
dec = (DB_decoder_t *)deadbeef->plug_get_for_id (deadbeef->pl_find_meta (st->settings->tracks[st->track_index], ":DECODER"));
deadbeef->pl_unlock ();
if (dec) {
fileinfo = dec->open (DDB_DECODER_HINT_RAW_SIGNAL);
if (fileinfo && dec->init (fileinfo, DB_PLAYITEM (st->settings->tracks[st->track_index])) != 0) {
st->settings->results[st->track_index].scan_result = DDB_RG_SCAN_RESULT_FILE_NOT_FOUND;
goto error;
}
if (fileinfo) {
st->gain_state[st->track_index] = ebur128_init(fileinfo->fmt.channels, fileinfo->fmt.samplerate, EBUR128_MODE_I);
st->peak_state[st->track_index] = ebur128_init(fileinfo->fmt.channels, fileinfo->fmt.samplerate, EBUR128_MODE_SAMPLE_PEAK);
// speaker mask mapping from WAV to EBUR128
static const int chmap[18] = {
EBUR128_LEFT,
EBUR128_RIGHT,
EBUR128_CENTER,
EBUR128_UNUSED,
EBUR128_LEFT_SURROUND,
EBUR128_RIGHT_SURROUND,
EBUR128_LEFT_SURROUND,
EBUR128_RIGHT_SURROUND,
EBUR128_CENTER,
EBUR128_LEFT_SURROUND,
EBUR128_RIGHT_SURROUND,
EBUR128_CENTER,
EBUR128_LEFT_SURROUND,
EBUR128_CENTER,
EBUR128_RIGHT_SURROUND,
EBUR128_LEFT_SURROUND,
EBUR128_CENTER,
EBUR128_RIGHT_SURROUND,
};
uint32_t channelmask = fileinfo->fmt.channelmask;
// first 18 speaker positions are known, the rest will be marked as UNUSED
int ch = 0;
for (int i = 0; i < 32 && ch < fileinfo->fmt.channels; i++) {
if (i < 18) {
if (channelmask & (1<<i))
{
ebur128_set_channel (st->gain_state[st->track_index], ch, chmap[i]);
ebur128_set_channel (st->peak_state[st->track_index], ch, chmap[i]);
ch++;
}
}
else {
ebur128_set_channel (st->gain_state[st->track_index], ch, EBUR128_UNUSED);
ebur128_set_channel (st->peak_state[st->track_index], ch, EBUR128_UNUSED);
ch++;
}
}
int samplesize = fileinfo->fmt.channels * fileinfo->fmt.bps / 8;
int bs = 2000 * samplesize;
ddb_waveformat_t fmt;
buffer = malloc (bs);
if (!fileinfo->fmt.is_float) {
bufferf = malloc (2000 * sizeof (float) * fileinfo->fmt.channels);
memcpy (&fmt, &fileinfo->fmt, sizeof (fmt));
fmt.bps = 32;
fmt.is_float = 1;
}
else {
bufferf = buffer;
}
int eof = 0;
for (;;) {
if (eof) {
break;
}
if (st->settings->pabort && *(st->settings->pabort)) {
break;
//.........这里部分代码省略.........
示例6:
// prepare to decode the track, fill in mandatory plugin fields
// return -1 on failure
static int
example_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
example_info_t *info = (example_info_t *)_info;
// take this parameters from your input file
// we set constants for clarity sake
_info->fmt.bps = 16;
_info->fmt.channels = 2;
_info->fmt.samplerate = 44100;
for (int i = 0; i < _info->fmt.channels; i++) {
_info->fmt.channelmask |= 1 << i;
}
_info->readpos = 0;
_info->plugin = &plugin;
if (it->endsample > 0) {
info->startsample = it->startsample;
info->endsample = it->endsample;
plugin.seek_sample (_info, 0);
}
else {
info->startsample = 0;
int TOTALSAMPLES = 1000; // calculate from file
info->endsample = TOTALSAMPLES-1;
}
return 0;
}
示例7: trace
static int
tta_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
tta_info_t *info = (tta_info_t *)_info;
deadbeef->pl_lock ();
const char *fname = deadbeef->pl_find_meta (it, ":URI")
trace ("open_tta_file %s\n", fname);
if (open_tta_file (fname, &info->tta, 0) != 0) {
deadbeef->pl_unlock ();
fprintf (stderr, "tta: failed to open %s\n", fname);
return -1;
}
if (player_init (&info->tta) != 0) {
deadbeef->pl_unlock ();
fprintf (stderr, "tta: failed to init player for %s\n", fname);
return -1;
}
deadbeef->pl_unlock ();
_info->fmt.bps = info->tta.BPS;
_info->fmt.channels = info->tta.NCH;
_info->fmt.samplerate = info->tta.SAMPLERATE;
for (int i = 0; i < _info->fmt.channels; i++) {
_info->fmt.channelmask |= 1 << i;
}
_info->readpos = 0;
_info->plugin = &plugin;
int64_t endsample = deadbeef->pl_item_get_endsample (it);
if (endsample > 0) {
info->startsample = deadbeef->pl_item_get_startsample (it);
info->endsample = endsample;
plugin.seek_sample (_info, 0);
}
else {
info->startsample = 0;
info->endsample = (info->tta.DATALENGTH)-1;
}
trace ("open_tta_file %s success!\n", deadbeef->pl_find_meta (it, ":URI"));
return 0;
}
示例8: if
static int
aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
aac_info_t *info = (aac_info_t *)_info;
info->file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
if (!info->file) {
return -1;
}
// probe
float duration = -1;
int samplerate = -1;
int channels = -1;
int totalsamples = -1;
info->junk = deadbeef->junk_get_leading_size (info->file);
if (!info->file->vfs->is_streaming ()) {
if (info->junk >= 0) {
deadbeef->fseek (info->file, info->junk, SEEK_SET);
}
else {
info->junk = 0;
}
}
else {
deadbeef->fset_track (info->file, it);
}
info->mp4track = -1;
#if USE_MP4FF
info->mp4reader.read = aac_fs_read;
info->mp4reader.write = NULL;
info->mp4reader.seek = aac_fs_seek;
info->mp4reader.truncate = NULL;
info->mp4reader.user_data = info;
#else
info->mp4reader.open = aac_fs_open;
info->mp4reader.seek = aac_fs_seek;
info->mp4reader.read = aac_fs_read;
info->mp4reader.write = NULL;
info->mp4reader.close = aac_fs_close;
#endif
if (!info->file->vfs->is_streaming ()) {
#ifdef USE_MP4FF
trace ("aac_init: mp4ff_open_read %s\n", deadbeef->pl_find_meta (it, ":URI"));
info->mp4file = mp4ff_open_read (&info->mp4reader);
if (info->mp4file) {
int ntracks = mp4ff_total_tracks (info->mp4file);
if (ntracks > 0) {
trace ("m4a container detected, ntracks=%d\n", ntracks);
int i = -1;
unsigned char* buff = 0;
unsigned int buff_size = 0;
for (i = 0; i < ntracks; i++) {
mp4AudioSpecificConfig mp4ASC;
mp4ff_get_decoder_config (info->mp4file, i, &buff, &buff_size);
if(buff){
int rc = AudioSpecificConfig(buff, buff_size, &mp4ASC);
if(rc < 0)
continue;
break;
}
}
trace ("mp4 probe-buffer size: %d\n", buff_size);
if (i != ntracks && buff)
{
trace ("mp4 track: %d\n", i);
int samples = mp4ff_num_samples(info->mp4file, i);
info->mp4samples = samples;
info->mp4track = i;
// init mp4 decoding
info->dec = NeAACDecOpen ();
unsigned long srate;
unsigned char ch;
if (NeAACDecInit2(info->dec, buff, buff_size, &srate, &ch) < 0) {
trace ("NeAACDecInit2 returned error\n");
free (buff);
return -1;
}
samplerate = srate;
channels = ch;
samples = (int64_t)samples * srate / mp4ff_time_scale (info->mp4file, i);
totalsamples = samples;
NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration (info->dec);
conf->dontUpSampleImplicitSBR = 1;
NeAACDecSetConfiguration (info->dec, conf);
mp4AudioSpecificConfig mp4ASC;
if (NeAACDecAudioSpecificConfig(buff, buff_size, &mp4ASC) >= 0)
{
info->mp4framesize = 1024;
if (mp4ASC.frameLengthFlag == 1) {
info->mp4framesize = 960;
}
// if (mp4ASC.sbr_present_flag == 1) {
// info->mp4framesize *= 2;
// }
}
//.........这里部分代码省略.........
示例9: alloca
static int
wv_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
wvctx_t *info = (wvctx_t *)_info;
deadbeef->pl_lock ();
info->file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
deadbeef->pl_unlock ();
if (!info->file) {
return -1;
}
#ifndef TINYWV
deadbeef->pl_lock ();
const char *uri = deadbeef->pl_find_meta (it, ":URI");
char *c_fname = alloca (strlen (uri) + 2);
if (c_fname) {
strcpy (c_fname, uri);
strcat (c_fname, "c");
info->c_file = deadbeef->fopen (c_fname);
}
else {
fprintf (stderr, "wavpack warning: failed to alloc memory for correction file name\n");
}
deadbeef->pl_unlock ();
#endif
char error[80];
#ifdef TINYWV
info->ctx = WavpackOpenFileInput (wv_read_stream, info->file, error);
#else
info->ctx = WavpackOpenFileInputEx (&wsr, info->file, info->c_file, error, OPEN_NORMALIZE, 0);
#endif
if (!info->ctx) {
fprintf (stderr, "wavpack error: %s\n", error);
return -1;
}
_info->plugin = &plugin;
_info->fmt.bps = WavpackGetBytesPerSample (info->ctx) * 8;
_info->fmt.channels = WavpackGetNumChannels (info->ctx);
_info->fmt.samplerate = WavpackGetSampleRate (info->ctx);
_info->fmt.is_float = (WavpackGetMode (info->ctx) & MODE_FLOAT) ? 1 : 0;
// FIXME: streamer and maybe output plugins need to be fixed to support
// arbitrary channelmask
// _info->fmt.channelmask = WavpackGetChannelMask (info->ctx);
for (int i = 0; i < _info->fmt.channels; i++) {
_info->fmt.channelmask |= 1 << i;
}
_info->readpos = 0;
if (it->endsample > 0) {
info->startsample = it->startsample;
info->endsample = it->endsample;
if (plugin.seek_sample (_info, 0) < 0) {
return -1;
}
}
else {
info->startsample = 0;
info->endsample = WavpackGetNumSamples (info->ctx)-1;
}
return 0;
}
示例10: if
static int
aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
aac_info_t *info = (aac_info_t *)_info;
deadbeef->pl_lock ();
info->file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
deadbeef->pl_unlock ();
if (!info->file) {
return -1;
}
// probe
float duration = -1;
int samplerate = -1;
int channels = -1;
int totalsamples = -1;
info->junk = deadbeef->junk_get_leading_size (info->file);
if (!info->file->vfs->is_streaming ()) {
if (info->junk >= 0) {
deadbeef->fseek (info->file, info->junk, SEEK_SET);
}
else {
info->junk = 0;
}
}
else {
deadbeef->fset_track (info->file, it);
}
info->mp4track = -1;
info->mp4reader.read = aac_fs_read;
info->mp4reader.write = NULL;
info->mp4reader.seek = aac_fs_seek;
info->mp4reader.truncate = NULL;
info->mp4reader.user_data = info;
if (!info->file->vfs->is_streaming ()) {
trace ("aac_init: mp4ff_open_read %s\n", deadbeef->pl_find_meta (it, ":URI"));
info->mp4 = mp4ff_open_read (&info->mp4reader);
if (info->mp4) {
int ntracks = mp4ff_total_tracks (info->mp4);
for (int i = 0; i < ntracks; i++) {
if (mp4ff_get_track_type (info->mp4, i) != TRACK_AUDIO) {
continue;
}
int res = mp4_track_get_info (info->mp4, i, &duration, &samplerate, &channels, &totalsamples, &info->mp4framesize);
if (res >= 0 && duration > 0) {
info->mp4track = i;
break;
}
}
trace ("track: %d\n", info->mp4track);
if (info->mp4track >= 0) {
// prepare decoder
int res = mp4_track_get_info (info->mp4, info->mp4track, &duration, &samplerate, &channels, &totalsamples, &info->mp4framesize);
if (res != 0) {
trace ("aac: mp4_track_get_info(%d) returned error\n", info->mp4track);
return -1;
}
// init mp4 decoding
info->mp4samples = mp4ff_num_samples(info->mp4, info->mp4track);
info->dec = NeAACDecOpen ();
unsigned long srate;
unsigned char ch;
unsigned char* buff = 0;
unsigned int buff_size = 0;
mp4AudioSpecificConfig mp4ASC;
mp4ff_get_decoder_config (info->mp4, info->mp4track, &buff, &buff_size);
if (NeAACDecInit2(info->dec, buff, buff_size, &srate, &ch) < 0) {
trace ("NeAACDecInit2 returned error\n");
free (buff);
return -1;
}
if (buff) {
free (buff);
}
trace ("aac: successfully initialized track %d\n", info->mp4track);
_info->fmt.samplerate = samplerate;
_info->fmt.channels = channels;
}
else {
trace ("aac: track not found in mp4 container\n");
mp4ff_close (info->mp4);
info->mp4 = NULL;
}
}
if (!info->mp4) {
trace ("aac: looking for raw stream...\n");
if (info->junk >= 0) {
deadbeef->fseek (info->file, info->junk, SEEK_SET);
}
else {
deadbeef->rewind (info->file);
}
int offs = parse_aac_stream (info->file, &samplerate, &channels, &duration, &totalsamples);
//.........这里部分代码省略.........
示例11: trace
static int
sndfile_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
sndfile_info_t *info = (sndfile_info_t*)_info;
SF_INFO inf;
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
if (!fp) {
trace ("sndfile: failed to open %s\n", deadbeef->pl_find_meta (it, ":URI"));
return -1;
}
int fsize = deadbeef->fgetlength (fp);
info->file = fp;
info->ctx = sf_open_virtual (&vfs, SFM_READ, &inf, info);
if (!info->ctx) {
trace ("sndfile: %s: unsupported file format\n");
return -1;
}
_info->plugin = &plugin;
info->sf_format = inf.format&0x000f;
switch (inf.format&0x000f) {
case SF_FORMAT_PCM_S8:
case SF_FORMAT_PCM_U8:
_info->fmt.bps = 8;
break;
case SF_FORMAT_PCM_16:
_info->fmt.bps = 16;
break;
case SF_FORMAT_PCM_24:
_info->fmt.bps = 24;
break;
case SF_FORMAT_FLOAT:
_info->fmt.is_float = 1;
case SF_FORMAT_PCM_32:
_info->fmt.bps = 32;
break;
default:
info->read_as_short = 1;
_info->fmt.bps = 16;
trace ("[sndfile] unidentified input format: 0x%X\n", inf.format&0x000f);
break;
}
_info->fmt.channels = inf.channels;
_info->fmt.samplerate = inf.samplerate;
int channel_map [inf.channels];
int cmdres = sf_command (info->ctx, SFC_GET_CHANNEL_MAP_INFO, channel_map, sizeof (channel_map)) ;
if (cmdres != SF_FALSE) {
// channel map found, convert to channel mask
_info->fmt.channelmask = wavex_gen_channel_mask (channel_map, inf.channels);
}
else {
// channel map not found, generate from channel number
for (int i = 0; i < inf.channels; i++) {
_info->fmt.channelmask |= 1 << i;
}
}
_info->readpos = 0;
if (it->endsample > 0) {
info->startsample = it->startsample;
info->endsample = it->endsample;
if (plugin.seek_sample (_info, 0) < 0) {
return -1;
}
}
else {
info->startsample = 0;
info->endsample = inf.frames-1;
}
// hack bitrate
int totalsamples = inf.frames;
float sec = (float)totalsamples / inf.samplerate;
if (sec > 0) {
info->bitrate = fsize / sec * 8 / 1000;
}
else {
info->bitrate = -1;
}
return 0;
}