+
+/* Load a sound resource into a GInputStream, by whatever method */
+static GInputStream *
+load_resource_into_giostream(glui32 snd)
+{
+ ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
+ GInputStream *retval;
+
+ if(glk_data->resource_map == NULL) {
+ if(glk_data->resource_load_callback == NULL) {
+ WARNING(_("No resource map has been loaded yet."));
+ return NULL;
+ }
+ char *filename = glk_data->resource_load_callback(CHIMARA_RESOURCE_SOUND, snd, glk_data->resource_load_callback_data);
+ if(filename == NULL) {
+ WARNING(_("Error loading resource from alternative location."));
+ return NULL;
+ }
+
+ GError *err = NULL;
+ GFile *file = g_file_new_for_path(filename);
+ retval = G_INPUT_STREAM(g_file_read(file, NULL, &err));
+ if(retval == NULL)
+ IO_WARNING(_("Error loading resource from file"), filename, err->message);
+ g_free(filename);
+ g_object_unref(file);
+ } else {
+ giblorb_result_t resource;
+ giblorb_err_t result = giblorb_load_resource(glk_data->resource_map, giblorb_method_Memory, &resource, giblorb_ID_Snd, snd);
+ if(result != giblorb_err_None) {
+ WARNING_S( _("Error loading resource"), giblorb_get_error_message(result) );
+ return NULL;
+ }
+ retval = g_memory_input_stream_new_from_data(resource.data.ptr, resource.length, NULL);
+ }
+ return retval;
+}