diff --git a/configure.ac b/configure.ac index ac236d0..1b4e706 100644 --- a/configure.ac +++ b/configure.ac @@ -24,7 +24,7 @@ AM_PROG_VALAC([0.7.0]) AC_PROG_INSTALL AC_PROG_INTLTOOL([0.35]) -pkg_modules="gtk+-2.0 >= 2.14.0 gstreamer-0.10 >= 0.10.17" +pkg_modules="gtk+-2.0 >= 2.14.0 gstreamer-0.10 >= 0.10.17 libavformat libavcodec" SPEK_PACKAGES="--pkg gtk+-2.0 --pkg gstreamer-0.10" PKG_CHECK_MODULES(SPEK, [$pkg_modules]) AC_SUBST(SPEK_CFLAGS) diff --git a/src/Makefile.am b/src/Makefile.am index e5c0f75..5006adb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -26,3 +26,6 @@ VALAFLAGS = \ spek_LDADD = \ $(SPEK_LIBS) \ $(IGE_MAC_LIBS) + +EXTRA_DIST = \ + spek-audio.h diff --git a/src/spek-audio.c b/src/spek-audio.c index 0afb778..c6a366e 100644 --- a/src/spek-audio.c +++ b/src/spek-audio.c @@ -18,5 +18,67 @@ #include "spek-audio.h" -void spek_audio_open (const char *file_name) { +void spek_audio_init () { + av_register_all (); +} + +SpekAudioContext * spek_audio_open (const char *file_name) { + SpekAudioContext *cx; + int i; + + cx = g_new0 (SpekAudioContext, 1); + cx->file_name = g_strdup (file_name); + + if (av_open_input_file (&cx->format_context, file_name, NULL, 0, NULL) != 0) { + /* TODO + */ + return cx; + } + if (av_find_stream_info (cx->format_context)) { + /* TODO + */ + return cx; + } + cx->audio_stream = -1; + for (i = 0; i < cx->format_context->nb_streams; i++) { + if (cx->format_context->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) { + cx->audio_stream = i; + break; + } + } + if (cx->audio_stream == -1) { + /* TODO + */ + 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 + */ + return cx; + } + if (avcodec_open (cx->codec_context, cx->codec) < 0) { + /* TODO + */ + return cx; + } + + return cx; +} + +void spek_audio_close (SpekAudioContext *cx) { + if (cx->file_name != NULL) { + g_free (cx->file_name); + } + if (cx->codec_context != NULL) { + avcodec_close (cx->codec_context); + } + if (cx->format_context != NULL) { + av_close_input_file (cx->format_context); + } + g_free (cx); } diff --git a/src/spek-audio.h b/src/spek-audio.h index ece7535..6ff8ff0 100644 --- a/src/spek-audio.h +++ b/src/spek-audio.h @@ -19,6 +19,26 @@ #ifndef __SPEK_AUDIO_H__ #define __SPEK_AUDIO_H__ -void spek_audio_open (const char *file_name); +#include +#include +#include + +typedef struct { + AVFormatContext *format_context; + gint audio_stream; + AVCodecContext *codec_context; + AVCodec *codec; + + /* Exposed properties + */ + gchar *file_name; + gint bit_rate; + gint sample_rate; + gint channels; +} SpekAudioContext; + +void spek_audio_init (); +SpekAudioContext * spek_audio_open (const char *file_name); +void spek_audio_close (SpekAudioContext *cx); #endif diff --git a/src/spek-pipeline.vala b/src/spek-pipeline.vala index 3d28e1b..48aab8d 100644 --- a/src/spek-pipeline.vala +++ b/src/spek-pipeline.vala @@ -18,15 +18,27 @@ namespace Spek { public class Pipeline { - public string file_name { get; private set; } - public string audio_codec { get; private set; } + private Audio.Context cx; public Pipeline (string file_name) { - this.file_name = file_name; + cx = new Audio.Context (file_name); + // TODO: check for errors } - public void open () { - Audio.open (file_name); + public string file_name { + get { return cx.file_name; } + } + + public int bit_rate { + get { return cx.bit_rate; } + } + + public int sample_rate { + get { return cx.sample_rate; } + } + + public int channels { + get { return cx.channels; } } } } diff --git a/src/spek-spectrogram.vala b/src/spek-spectrogram.vala index e545f85..e0cfd2c 100644 --- a/src/spek-spectrogram.vala +++ b/src/spek-spectrogram.vala @@ -62,6 +62,11 @@ namespace Spek { public void open (string file_name) { this.file_name = file_name; this.info = ""; + + // 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); + start (); } diff --git a/src/spek.vala b/src/spek.vala index 9c8f6e7..ef877f0 100644 --- a/src/spek.vala +++ b/src/spek.vala @@ -16,45 +16,46 @@ * along with Spek. If not, see . */ -using Spek; +namespace Spek { + bool version = false; + [CCode (array_length = false, array_null_terminated = true)] + string[] files = null; -bool version = false; -[CCode (array_length = false, array_null_terminated = true)] -string[] files = null; + const OptionEntry[] options = { + { "version", 'V', 0, OptionArg.NONE, ref version, N_("Display the version and exit"), null }, + { "", 0, 0, OptionArg.FILENAME_ARRAY, ref files, null, null }, + { null } + }; -const OptionEntry[] options = { - { "version", 'V', 0, OptionArg.NONE, ref version, N_("Display the version and exit"), null }, - { "", 0, 0, OptionArg.FILENAME_ARRAY, ref files, null, null }, - { null } -}; + int main (string[] args) { + Intl.bindtextdomain (Config.GETTEXT_PACKAGE, Config.LOCALEDIR); + Intl.bind_textdomain_codeset (Config.GETTEXT_PACKAGE, "UTF-8"); + Intl.textdomain (Config.GETTEXT_PACKAGE); -int main (string[] args) { - Intl.bindtextdomain (Config.GETTEXT_PACKAGE, Config.LOCALEDIR); - Intl.bind_textdomain_codeset (Config.GETTEXT_PACKAGE, "UTF-8"); - Intl.textdomain (Config.GETTEXT_PACKAGE); + try { + Gtk.init_with_args (ref args, _("[FILE]"), (OptionEntry[]) options, Config.GETTEXT_PACKAGE); + } catch (Error e) { + print (e.message); + print ("\n"); + print (_("Run `%s --help` to see a full list of available command line options.\n"), args[0]); + return 1; + } - try { - Gtk.init_with_args (ref args, _("[FILE]"), (OptionEntry[]) options, Config.GETTEXT_PACKAGE); - } catch (Error e) { - print (e.message); - print ("\n"); - print (_("Run `%s --help` to see a full list of available command line options.\n"), args[0]); - return 1; - } + if (version) { + print (_("%s version %s\n"), Config.PACKAGE_NAME, Config.PACKAGE_VERSION); + return 0; + } - if (version) { - print (_("%s version %s\n"), Config.PACKAGE_NAME, Config.PACKAGE_VERSION); + if (files != null && files.length != 1) { + print (_("Specify a single file\n")); + return 1; + } + + Audio.init (); + Gst.init (ref args); + var window = new Window (files == null ? null : files[0]); + Gtk.main (); + window.destroy (); return 0; } - - if (files != null && files.length != 1) { - print (_("Specify a single file\n")); - return 1; - } - - Gst.init (ref args); - var window = new Window (files == null ? null : files[0]); - Gtk.main (); - window.destroy (); - return 0; -} +} \ No newline at end of file diff --git a/vapi/spek-audio.vapi b/vapi/spek-audio.vapi index 4798466..1d38c12 100644 --- a/vapi/spek-audio.vapi +++ b/vapi/spek-audio.vapi @@ -1,4 +1,15 @@ [CCode (cprefix = "SpekAudio", lower_case_cprefix = "spek_audio_", cheader_filename = "spek-audio.h")] namespace Spek.Audio { - public static void open (string file_name); + [Compact] + [CCode (free_function = "spek_audio_close")] + public class Context { + public string file_name; + public int bit_rate; + public int sample_rate; + public int channels; + + [CCode (cname = "spek_audio_open")] + public Context (string file_name); + } + public static void init (); }