mirror of
https://github.com/alexkay/spek.git
synced 2025-04-20 10:27:38 +03:00
Implement spek_audio_open()
This commit is contained in:
parent
1ea744502a
commit
90e861a77a
@ -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)
|
||||
|
@ -26,3 +26,6 @@ VALAFLAGS = \
|
||||
spek_LDADD = \
|
||||
$(SPEK_LIBS) \
|
||||
$(IGE_MAC_LIBS)
|
||||
|
||||
EXTRA_DIST = \
|
||||
spek-audio.h
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -19,6 +19,26 @@
|
||||
#ifndef __SPEK_AUDIO_H__
|
||||
#define __SPEK_AUDIO_H__
|
||||
|
||||
void spek_audio_open (const char *file_name);
|
||||
#include <glib.h>
|
||||
#include <libavformat/avformat.h>
|
||||
#include <libavcodec/avcodec.h>
|
||||
|
||||
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
|
||||
|
@ -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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 ();
|
||||
}
|
||||
|
||||
|
@ -16,45 +16,46 @@
|
||||
* along with Spek. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
@ -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 ();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user