void CDDBInfo::init(const CDPlayer& cdplayer) { // Initialize current data structure disc_data data; cddb_init_disc_data(&data); genDefaultInfo(cdplayer,&data); fillCurrentData(data); cddb_free_disc_data(&data); // Initialize query string for remote info request if local copy disabled or not found FXint len=BUFSIZ; char buffer[BUFSIZ]; querystring=cddb_query_string(cdplayer.getDescriptor(),buffer,&len); // Initialize the discid and disc_info values when working with local copies if(settings.localcopy) { discid=cddb_discid(cdplayer.getDescriptor()); cd_init_disc_info(&discinfo); cd_stat(cdplayer.getDescriptor(),&discinfo); } // Allocate CDDB resources here, to be deallocated in destructor, so that // thread can be canceled at any time without leaking memory cddb_init_cddb_query(&query); cddb_init_cddb_hello(&hello); hello.hello_program=cddb_strdup(PROG_PACKAGE); hello.hello_version=cddb_strdup(PROG_VERSION); hello.hello_user=cddb_strdup("anonymous"); hello.hello_hostname=cddb_strdup("anonymous"); cddb_init_cddb_host(&host); host.host_server.server_name=cddb_strdup(settings.cddbaddr.text()); host.host_server.server_port=(settings.cddbproto==CDDB_PROTOCOL_CDDBP)?settings.cddbpport:settings.cddbport; host.host_protocol=(settings.cddbproto==CDDB_PROTOCOL_CDDBP)?CDDB_MODE_CDDBP:CDDB_MODE_HTTP; if(settings.cddbproto==CDDB_PROTOCOL_HTTP) host.host_addressing=cddb_strdup(settings.cddbexec.text()); if(settings.proxy) { cddb_init_cddb_server(&server); server.server_name=cddb_strdup(settings.proxyaddr.text()); server.server_port=settings.proxyport; pserver=&server; } }
static gboolean gst_cdaudio_query (GstElement * element, GstQuery * query) { GstCDAudio *cdaudio; gboolean res = TRUE; gulong micros; gdouble seconds; cdaudio = GST_CDAUDIO (element); GST_LOG_OBJECT (element, "handling %s query", gst_query_type_get_name (GST_QUERY_TYPE (query))); /* take new snapshot every 1000 miliseconds */ seconds = g_timer_elapsed (cdaudio->timer, µs); if (micros > 1000 || seconds > 1) { cd_stat (cdaudio->cd_desc, &cdaudio->info); g_timer_start (cdaudio->timer); } switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: { GstFormat dest_format; gint64 dest_val; gst_query_parse_duration (query, &dest_format, NULL); switch (dest_format) { case GST_FORMAT_TIME: dest_val = (cdaudio->info.disc_length.minutes * 60 + cdaudio->info.disc_length.seconds) * GST_SECOND; break; default: { if (dest_format == track_format) { dest_val = cdaudio->info.disc_total_tracks; } else { res = FALSE; } break; } } if (res) gst_query_set_duration (query, dest_format, dest_val); break; } case GST_QUERY_POSITION: { GstFormat dest_format; gint64 dest_val; gst_query_parse_position (query, &dest_format, NULL); switch (dest_format) { case GST_FORMAT_TIME: dest_val = (cdaudio->info.disc_time.minutes * 60 + cdaudio->info.disc_time.seconds) * GST_SECOND; break; default: { if (dest_format == track_format) { dest_val = cdaudio->info.disc_current_track; } else { res = FALSE; } break; } } if (res) gst_query_set_position (query, dest_format, dest_val); break; } default: res = FALSE; break; } return res; }
static GstStateChangeReturn gst_cdaudio_change_state (GstElement * element, GstStateChange transition) { GstCDAudio *cdaudio; GstStateChangeReturn ret; gint res; cdaudio = GST_CDAUDIO (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: if ((res = cd_init_device (cdaudio->device)) < 0) goto init_failed; cdaudio->cd_desc = res; /* close tray */ if ((res = cd_close (cdaudio->cd_desc)) < 0) goto close_failed; if ((res = cd_stat (cdaudio->cd_desc, &cdaudio->info)) < 0) { /* we just give a warning here */ GST_ELEMENT_WARNING (cdaudio, LIBRARY, INIT, ("Could not retrieve CD track info."), (NULL)); } else { debug_track_info (cdaudio); cdaudio->discid = cddb_discid (cdaudio->cd_desc); /* FIXME, post message with discid */ } cdaudio->was_playing = FALSE; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: { if (cdaudio->was_playing) res = cd_resume (cdaudio->cd_desc); else res = cd_play (cdaudio->cd_desc, 1); if (res < 0) goto play_failed; cdaudio->was_playing = TRUE; g_timer_start (cdaudio->timer); break; } default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: if ((res = cd_pause (cdaudio->cd_desc)) < 0) goto pause_failed; g_timer_stop (cdaudio->timer); break; case GST_STATE_CHANGE_PAUSED_TO_READY: if ((res = cd_stop (cdaudio->cd_desc)) < 0) goto stop_failed; if ((res = cd_finish (cdaudio->cd_desc)) < 0) goto finish_failed; cdaudio->cd_desc = -1; break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; /* ERRORS */ init_failed: { GST_ELEMENT_ERROR (cdaudio, LIBRARY, INIT, ("Could not init CD device %s. (%d)", cdaudio->device, res), (NULL)); cdaudio->cd_desc = -1; return GST_STATE_CHANGE_FAILURE; } close_failed: { GST_ELEMENT_ERROR (cdaudio, LIBRARY, INIT, ("Could not close CD tray for device %s. (%d)", cdaudio->device, res), (NULL)); return GST_STATE_CHANGE_FAILURE; } play_failed: { GST_ELEMENT_ERROR (cdaudio, LIBRARY, INIT, ("Could not play CD device %s. (%d)", cdaudio->device, res), (NULL)); return GST_STATE_CHANGE_FAILURE; } pause_failed: { GST_ELEMENT_ERROR (cdaudio, LIBRARY, INIT, ("Could not pause CD device %s. (%d)", cdaudio->device, res), (NULL)); return GST_STATE_CHANGE_FAILURE; } stop_failed: { GST_ELEMENT_ERROR (cdaudio, LIBRARY, INIT, ("Could not stop CD device %s. (%d)", cdaudio->device, res), (NULL)); return GST_STATE_CHANGE_FAILURE; } finish_failed: { GST_ELEMENT_ERROR (cdaudio, LIBRARY, INIT, ("Could not finish CD device %s. (%d)", cdaudio->device, res), (NULL)); return GST_STATE_CHANGE_FAILURE; } }