KvpValue * gnc_scm_to_kvp_value_ptr(SCM val) { if (scm_is_number(val)) { /* in guile 1.8 (exact? ) only works on numbers */ if (scm_is_exact (val) && gnc_gh_gint64_p(val)) { return new KvpValue{scm_to_int64(val)}; } else { return new KvpValue{scm_to_double(val)}; } } else if (gnc_numeric_p(val)) { return new KvpValue{gnc_scm_to_numeric(val)}; } else if (gnc_guid_p(val)) { auto guid = gnc_scm2guid(val); auto tmpguid = guid_copy(&guid); return new KvpValue{tmpguid}; } else if (gnc_timepair_p(val)) { Timespec ts = gnc_timepair2timespec(val); return new KvpValue{ts}; } else if (scm_is_string(val)) { return new KvpValue{gnc_scm_to_utf8_string(val)}; } else if (SWIG_IsPointerOfType(val, SWIG_TypeQuery("_p_KvpFrame"))) { #define FUNC_NAME G_STRFUNC auto vp_frame = SWIG_MustGetPtr(val, SWIG_TypeQuery("_p_KvpFrame"), 1, 0); KvpFrame *frame = static_cast<KvpFrame*>(vp_frame); #undef FUNC_NAME return new KvpValue{frame}; } /* FIXME: add list handler here */ return NULL; }
gint gnc_report_add(SCM report) { SCM get_id = scm_c_eval_string("gnc:report-id"); SCM value; gint id, *key; gnc_report_init_table(); value = scm_call_1(get_id, report); if (scm_is_number(value)) { id = scm_num2int(value, SCM_ARG1, G_STRFUNC); if (!g_hash_table_lookup(reports, &id)) { key = g_new(gint, 1); *key = id; g_hash_table_insert(reports, key, (gpointer)report); scm_gc_protect_object(report); return id; } g_warning("Report specified id of %d is already is use. " "Using generated id.", id); } id = report_next_serial_id++; while (id < G_MAXINT) { if (!g_hash_table_lookup(reports, &id)) { key = g_new(gint, 1); *key = id; g_hash_table_insert(reports, key, (gpointer)report); scm_gc_protect_object(report); return id; } id = report_next_serial_id++; } g_warning("Unable to add report to table. %d reports in use.", G_MAXINT); report_next_serial_id = G_MAXINT; return G_MAXINT; }
static SCM pg_format_sql(SCM conn, SCM obj) { struct pg_conn *pgc; SCM out; if (SCM_SMOB_PREDICATE(time_tag, obj)) { out = format_time(obj, c2s("'%Y-%m-%d %H:%M:%S'")); } else if (scm_boolean_p(obj) == SCM_BOOL_T) { if (scm_is_true(obj)) out = c2s("'t'"); else out = c2s("'f'"); } else if (scm_is_number(obj)) { out = scm_number_to_string(obj, scm_from_signed_integer(10)); } else if (scm_is_symbol(obj)) { out = pg_format_sql(conn, scm_symbol_to_string(obj)); } else if (scm_is_string(obj)) { if (scm_string_null_p(obj) == SCM_BOOL_T) out = c2s("NULL"); else { char *src = scm_to_utf8_string(obj); scm_assert_smob_type(pg_conn_tag, conn); pgc = (struct pg_conn *)SCM_SMOB_DATA(conn); scm_lock_mutex(pgc->mutex); char *sql = PQescapeLiteral(pgc->conn, src, strlen(src)); out = safe_from_utf8(sql); scm_unlock_mutex(pgc->mutex); free(src); PQfreemem(sql); } } else if (scm_is_null(obj)) out = c2s("NULL"); else out = c2s("NULL"); scm_remember_upto_here_1(out); scm_remember_upto_here_2(conn, obj); return out; }
static SCM open_vorbis_stream(SCM server, SCM port, SCM password, SCM mount, SCM config) { SCM smob; double qual; char stream_name[32]; VORBIS_STREAM *stream; stream = (VORBIS_STREAM *)my_gc_malloc(sizeof(VORBIS_STREAM), "vorbis_stream", "vorbis stream"); stream->header.shutdown = vorbis_shutdown; vorbis_info_init(&(stream->vi)); SCM quality = get_property(config, "quality"); if (scm_is_number(quality)) qual = scm_to_double(quality); else qual = 0.6; scm_remember_upto_here_1(quality); stream->header.shoutbuf = NULL; stream->header.shoutbuf_size = 0; stream->header.rb_size = sizeof(sample_t) * RB_SECS * sampling_rate * QMX_CHANNELS + 0.5; stream->header.ringbuf = jack_ringbuffer_create(stream->header.rb_size); if (vorbis_encode_init_vbr(&(stream->vi), QMX_CHANNELS, sampling_rate, qual) != 0) { log_msg("vorbis init failed\n"); return SCM_BOOL_F; } if ((stream->header.shout = shout_new()) == NULL) { log_msg("can't create shout instance\n"); return SCM_BOOL_F; } vorbis_analysis_init(&(stream->vd), &(stream->vi)); vorbis_block_init(&(stream->vd), &(stream->vb)); ogg_stream_init(&(stream->os), rand()); vorbis_comment_init(&(stream->vc)); vorbis_comment_add_tag(&(stream->vc), "ENCODER", "QMX"); shout_set_protocol(stream->header.shout, SHOUT_PROTOCOL_HTTP); shout_set_format(stream->header.shout, SHOUT_FORMAT_OGG); char *server_s = scm_to_locale_string(server); // server shout_set_host(stream->header.shout, server_s); free(server_s); shout_set_port(stream->header.shout, scm_to_int(port)); // port shout_set_user(stream->header.shout, "source"); // user char *password_s = scm_to_locale_string(password); // password shout_set_password(stream->header.shout, password_s); free(password_s); char *mount_s = scm_to_locale_string(mount); // mount pt shout_set_mount(stream->header.shout, mount_s); SCM title = get_property(config, "title"); if (scm_is_string(title)) { char *title_s = scm_to_locale_string(title); if (strlen(title_s) > 0) vorbis_comment_add_tag(&(stream->vc), "TITLE", title_s); free(title_s); } scm_remember_upto_here_1(title); SCM name = get_property(config, "name"); stream_name[0] = '\0'; if (scm_is_string(name)) { char *name_s = scm_to_locale_string(name); shout_set_name(stream->header.shout, name_s); snprintf(stream_name, sizeof(stream_name), "'%s' ", name_s); free(name_s); } scm_remember_upto_here_1(name); SCM description = get_property(config, "description"); if (scm_is_string(description)) { char *description_s = scm_to_locale_string(description); shout_set_description(stream->header.shout, description_s); free(description_s); } scm_remember_upto_here_1(description); SCM genre = get_property(config, "genre"); if (scm_is_string(genre)) { char *genre_s = scm_to_locale_string(genre); shout_set_genre(stream->header.shout, genre_s); free(genre_s); } scm_remember_upto_here_1(genre); shout_set_audio_info(stream->header.shout, SHOUT_AI_CHANNELS, encode_int(QMX_CHANNELS)); shout_set_audio_info(stream->header.shout, SHOUT_AI_SAMPLERATE, encode_int(sampling_rate)); if (shout_open(stream->header.shout) == SHOUTERR_SUCCESS) { log_msg("vorbis stream %smounted at %s\n", stream_name, mount_s); free(mount_s); } else { log_msg("vorbis stream %sfailed to open: %s\n", stream_name, shout_get_error(stream->header.shout)); free(mount_s); shout_free(stream->header.shout); return SCM_BOOL_F; } vorbis_streams += 1; stream->header.eos = 0; SCM_NEWSMOB(smob, vorbis_stream_tag, stream); streams = link_in(streams, smob); stream->header.do_prep = need_prepper; need_prepper = 0; stream->header.bookmark = 0; add_outbuf_client(load_frames, process_frames, (void *)stream, "Ogg-Vorbis stream"); spawn_detached_thread(shout_thread, (void *)&(stream->header)); scm_remember_upto_here_1(smob); return smob; }