X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/blobdiff_plain/94fc44d9acf969477faac61bd60a6812404727f9..ca8ee16cfde42ea27d40f8e45fa6d96dc24cd5d9:/src/engine/music.c diff --git a/src/engine/music.c b/src/engine/music.c index 87a549b..f770662 100644 --- a/src/engine/music.c +++ b/src/engine/music.c @@ -3,6 +3,7 @@ #include #include "exportable.h" +#include "loadable.h" #include "uobject.h" #include "music.h" #include "upkg.h" @@ -12,14 +13,41 @@ struct music_priv { struct upkg_file *f; + unsigned loaded; }; static void exportable_init(UObjectExportable *); +static void loadable_init(UObjectLoadable *); G_DEFINE_DYNAMIC_TYPE_EXTENDED(EngineMusic, engine_music, U_OBJECT_TYPE, 0, G_IMPLEMENT_INTERFACE(U_OBJECT_TYPE_EXPORTABLE, exportable_init) + G_IMPLEMENT_INTERFACE(U_OBJECT_TYPE_LOADABLE, loadable_init) ); +static int load(GObject *o) +{ + struct music_priv *priv = MUSIC_GET_PRIV(o); + + if (!priv->loaded) { + g_return_val_if_fail(priv->f != NULL, -1); + + if (upkg_export_seek(priv->f, 0, SEEK_SET) != 0) { + return -1; + } + } + + priv->loaded++; + return 0; +} + +static void unload(GObject *o) +{ + struct music_priv *priv = MUSIC_GET_PRIV(o); + g_return_if_fail(priv->loaded > 0); + + --priv->loaded; +} + static int export(GObject *o, FILE *f) { struct music_priv *priv = MUSIC_GET_PRIV(o); @@ -54,6 +82,12 @@ static void exportable_init(UObjectExportable *e) e->export_name = export_name; } +static void loadable_init(UObjectLoadable *l) +{ + l->load = load; + l->unload = unload; +} + static int deserialize(UObject *o, struct upkg_file *f) { struct music_priv *priv = MUSIC_GET_PRIV(o); @@ -99,15 +133,28 @@ void music_register(GTypeModule *m) static void engine_music_init(EngineMusic *m) { + struct music_priv *priv = MUSIC_GET_PRIV(m); + *priv = (struct music_priv){0}; +} + +static void engine_music_finalize(GObject *o) +{ + struct music_priv *priv = MUSIC_GET_PRIV(o); + + if (priv->loaded >= 1) { + priv->loaded = 1; + unload(o); + } } static void engine_music_class_init(EngineMusicClass *class) { UObjectClass *uo = U_OBJECT_CLASS(class); - + GObjectClass *go = G_OBJECT_CLASS(class); g_type_class_add_private(class, sizeof (struct music_priv)); uo->deserialize = deserialize; + go->finalize = engine_music_finalize; } static void engine_music_class_finalize(EngineMusicClass *class)