Build the audio description string using ffmpeg

This commit is contained in:
Alexander Kojevnikov 2010-06-30 14:29:58 +10:00
parent 90e861a77a
commit fd0d80815d
5 changed files with 48 additions and 7 deletions

View File

@ -19,6 +19,7 @@
#include "spek-audio.h"
void spek_audio_init () {
avcodec_init ();
av_register_all ();
}
@ -32,11 +33,13 @@ SpekAudioContext * spek_audio_open (const char *file_name) {
if (av_open_input_file (&cx->format_context, file_name, NULL, 0, NULL) != 0) {
/* TODO
*/
printf ("cannot open\n");
return cx;
}
if (av_find_stream_info (cx->format_context)) {
if (av_find_stream_info (cx->format_context) < 0) {
/* TODO
*/
printf ("cannot find stream info\n");
return cx;
}
cx->audio_stream = -1;
@ -49,24 +52,32 @@ SpekAudioContext * spek_audio_open (const char *file_name) {
if (cx->audio_stream == -1) {
/* TODO
*/
printf ("no audio streams\n");
return cx;
}
cx->codec_context = cx->format_context->streams[cx->audio_stream]->codec;
cx->bit_rate = cx->codec_context->bit_rate;
cx->sample_rate = cx->codec_context->sample_rate;
cx->channels = cx->codec_context->channels;
cx->codec = avcodec_find_decoder (cx->codec_context->codec_id);
if (cx->codec == NULL) {
/* TODO
*/
printf ("cannot find decoder\n");
return cx;
}
if (avcodec_open (cx->codec_context, cx->codec) < 0) {
/* TODO
*/
printf ("cannot open decoder\n");
return cx;
}
cx->codec_name = g_strdup (cx->codec->long_name);
cx->bit_rate = cx->codec_context->bit_rate;
cx->sample_rate = cx->codec_context->sample_rate;
cx->bits_per_sample = cx->codec_context->bits_per_raw_sample;
if (!cx->bits_per_sample) {
/* APE uses bpcs, FLAC uses bprs. */
cx->bits_per_sample = cx->codec_context->bits_per_coded_sample;
}
cx->channels = cx->codec_context->channels;
return cx;
}
@ -74,6 +85,9 @@ void spek_audio_close (SpekAudioContext *cx) {
if (cx->file_name != NULL) {
g_free (cx->file_name);
}
if (cx->codec_name != NULL) {
g_free (cx->codec_name);
}
if (cx->codec_context != NULL) {
avcodec_close (cx->codec_context);
}

View File

@ -32,8 +32,10 @@ typedef struct {
/* Exposed properties
*/
gchar *file_name;
gchar *codec_name;
gint bit_rate;
gint sample_rate;
gint bits_per_sample;
gint channels;
} SpekAudioContext;

View File

@ -19,10 +19,33 @@
namespace Spek {
public class Pipeline {
private Audio.Context cx;
public string description { get; private set; }
public Pipeline (string file_name) {
cx = new Audio.Context (file_name);
// TODO: check for errors
cx = new Audio.Context (file_name);
// Build the description string.
string[] items = {};
if (cx.codec_name != null) {
items += cx.codec_name;
}
if (cx.bit_rate != 0) {
items += _("%d kbps").printf (cx.bit_rate / 1000);
}
if (cx.sample_rate != 0) {
items += _("%d Hz").printf (cx.sample_rate);
}
// Show bits per sample only if there is no bitrate.
if (cx.bits_per_sample != 0 && cx.bit_rate == 0) {
items += ngettext (
"%d bit", "%d bits", cx.bits_per_sample).printf (cx.bits_per_sample);
}
if (cx.channels != 0) {
items += ngettext ("%d channel", "%d channels", cx.channels).
printf (cx.channels);
}
description = items.length > 0 ? string.joinv (", ", items) : "";
}
public string file_name {

View File

@ -65,7 +65,7 @@ namespace Spek {
// TODO
var pipeline = new Pipeline (file_name);
print ("%s:\nbr=%i sr=%i ch=%i\n\n", pipeline.file_name, pipeline.bit_rate, pipeline.sample_rate, pipeline.channels);
print ("%s:\n%s\n", file_name, pipeline.description);
start ();
}

View File

@ -4,8 +4,10 @@ namespace Spek.Audio {
[CCode (free_function = "spek_audio_close")]
public class Context {
public string file_name;
public string codec_name;
public int bit_rate;
public int sample_rate;
public int bits_per_sample;
public int channels;
[CCode (cname = "spek_audio_open")]