mirror of
https://github.com/alexkay/spek.git
synced 2025-04-24 03:50:55 +03:00
Build the audio description string using ffmpeg
This commit is contained in:
parent
90e861a77a
commit
fd0d80815d
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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 ();
|
||||
}
|
||||
|
@ -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")]
|
||||
|
Loading…
x
Reference in New Issue
Block a user