Esempio n. 1
0
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;
  }
}
Esempio n. 2
0
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, &micros);
  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;
}
Esempio n. 3
0
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;
  }
}