Esempio n. 1
0
static void
lookup_cd_info (char *device, album_info_t *album)
{
    MbDisc disc;
    MbQuery q;
    MbReleaseFilter f;
    MbResultList results;
    MbRelease release;
    char discid[100];
    int num_albums;

    memset(album, 1, sizeof(*album));

    disc = mb_read_disc(device);
    if (!disc) {
        fprintf(stderr, "unable to identify disc.\n");
        exit(1);
    }

    mb_disc_get_id(disc, discid, 100);
    fprintf(stderr, "got disc id: %s\n\n", discid);

    q = mb_query_new(NULL, NULL);
    f = mb_release_filter_new();

    mb_release_filter_disc_id(f, discid);
    results = mb_query_get_releases(q,f);

    mb_release_filter_free(f);
    mb_query_free(q);

    if (!results) {
        fprintf(stderr, "no results found\n");
        exit(1);
    }

    num_albums = mb_result_list_get_size(results);
    if (num_albums < 1) {
        char buf[256];
        mb_get_submission_url(disc, 0, 0, buf, sizeof(buf));
        fprintf(stderr, "nothing in musicbrainz for this one. add it via: %s\n", buf);
        exit(1);
    }

    if (num_albums > 1) {
        fprintf(stderr, "multiple albums!!! picking the last one\n");
    }

    release = mb_result_list_get_release(results, num_albums-1);
    get_album(release, &album->album_id, &album->title, &album->disc_number);

    album->release_date = get_release_date(release);

    get_album_artist(
        release, &album->artist_id, &album->artist, &album->artist_sortname
    );

    get_tracks(release, album);


    /*
    musicbrainz_t mb;
    char buf[256];
    int num_albums;

    mb = mb_New();
    mb_SetDevice(mb, device);
    mb_UseUTF8(mb, TRUE);

#ifdef MB_DEBUG
    mb_SetDebug(mb, TRUE);
#endif

    memset(album, 1, sizeof(*album));
    if (!mb_Query(mb, MBQ_GetCDInfo)) {
        mb_GetQueryError(mb, buf, sizeof(buf));
        fprintf(stderr, "unable to query cd: %s\n", buf);
        exit(1);
    }

    num_albums = mb_GetResultInt(mb, MBE_GetNumAlbums);

    if (num_albums < 1) {
        fprintf(stderr, "nothing in musicbrainz for this one. TODO add url\n");
        exit(1);
    }

    if (num_albums > 1) {
        fprintf(stderr, "multiple albums!!! picking the last one\n");
    }

    mb_Select1(mb, MBS_SelectAlbum, num_albums);

    get_album(mb, &album->album_id, &album->title, &album->disc_number);

    album->release_date = get_release_date(mb);
    
    get_album_artist(
        mb, &album->artist_id, &album->artist, &album->artist_sortname
    );

    get_tracks(mb, album);

    mb_Delete(mb);
    */
}
Esempio n. 2
0
//----扫描可视域---------------------------------------------------------------
//功能: 1、把visible_clip备份到visible_bak中。
//      2、所有窗口生成新的visible_clip
//参数: display,被扫描的显示器
//返回: false=失败,一般是因为剪切域池容量不够
//-----------------------------------------------------------------------------
bool_t __gk_scan_new_visible_clip(struct display_rsc *display)
{
    struct gkwin_rsc *tempwin;
    struct st_rect *rect;
    struct clip_rect *clip,*clip1,*clip_head = NULL;
    s32 num,rect_left,rect_top,rect_right,rect_bottom,loop,temp;
    u8 *sort_array_x,*sort_array_y;

    sort_array_x = m_malloc((display->width+1)*sizeof(u8) 
                            + (display->height+1)*sizeof(u8),0);
    if(sort_array_x == NULL)
        return false;
    sort_array_y = sort_array_x + display->width+1;
    for(num = 0; num <= display->width; num++)
        sort_array_x[num] = 0;
    for(num = 0; num <= display->height; num++)
        sort_array_y[num] = 0;
    tempwin = display->z_topmost;
    rect_left = 0;
    rect_top = 0;
    while(1)
    {     //取窗口可视边框,该边框是窗口受祖先窗口限制后的矩形
        temp = tempwin->limit_left-tempwin->left + tempwin->absx0;
        if(sort_array_x[temp] == 0)
        {
            sort_array_x[temp] = 1;
            rect_left++;
        }
        
        temp = tempwin->limit_right-tempwin->left+tempwin->absx0;
        if(sort_array_x[temp] == 0)
        {
            sort_array_x[temp] = 1;
            rect_left++;
        }
        
        temp = tempwin->limit_top-tempwin->top + tempwin->absy0;
        if(sort_array_y[temp] == 0)
        {
            sort_array_y[temp] = 1;
            rect_top++;
        }
        
        temp = tempwin->limit_bottom-tempwin->top+tempwin->absy0;
        if(sort_array_y[temp] == 0)
        {
            sort_array_y[temp] = 1;
            rect_top++;
        }
        
        //执行__gk_get_redraw_clip_all函数注释中的step1
        //保存窗口原来的可视域
        tempwin->visible_bak = tempwin->visible_clip;
        tempwin->visible_clip = NULL;
        if(tempwin != display->desktop)
            tempwin = tempwin->z_back;
        else
            break;
    }
    //处理桌面下的窗口,这些窗口肯定没有可视域
    while(1)
    {
        tempwin = tempwin->z_back;
        if(tempwin == display->z_topmost)
            break;
        tempwin->visible_bak = tempwin->visible_clip;
        tempwin->visible_clip = NULL;
    }
    if(mb_query_free(pg_clip_rect_pool) < (u32)((rect_left-1)*(rect_top-1)))
    {
        m_free(sort_array_x);
        return false;           //内存池不足,无法生成可视域队列
    }
    //按从左到右,从上到下的顺序(顺序不能改变)把所有垂直线、水平线围成的小clip
    //串成双向链表,由clip_head做链表头
    rect_top = 0;
    temp = 0;
    for(rect_bottom =1;rect_bottom <= display->height; rect_bottom++)
    {
        if(sort_array_y[rect_bottom] == 0)
            continue;
        rect_left = 0;
        for(rect_right =1;rect_right <= display->width; rect_right++)
        {
            if(sort_array_x[rect_right] == 0)
                continue;
            clip = (struct clip_rect*)mb_malloc(pg_clip_rect_pool,0);
            clip->rect.left = rect_left;
            clip->rect.right = rect_right;
            clip->rect.top = rect_top;
            clip->rect.bottom = rect_bottom;
            rect_left = rect_right;
            __gk_clip_connect(&clip_head,clip);      //把小clip加入到链接起来
            temp++;
        }
        rect_top = rect_bottom;
    }
    m_free(sort_array_x);

    //下面判断小clip的归属,并把他们加入到所属win的new_clip队列中
    tempwin = display->z_topmost;
    while(1)
    {
        clip = clip_head;
        for(loop = temp; loop >0; loop--)
        {
            rect = &(clip->rect);
            if((rect->left>=tempwin->limit_left-tempwin->left+tempwin->absx0)
               &&(rect->top>=tempwin->limit_top-tempwin->top+tempwin->absy0)
               &&(rect->right<=tempwin->limit_right-tempwin->left+tempwin->absx0)
               &&(rect->bottom<=tempwin->limit_bottom-tempwin->top+tempwin->absy0))
            {   //矩形在tempwin的可显示范围内,若不在则无需处理
                //允许alpha或透明,区域将加入窗口可视域,但不从临时链表中删除。
                if(tempwin->dest_blend)
                {
                    clip1 = (struct clip_rect*)mb_malloc(pg_clip_rect_pool,0);
                    *clip1 = *clip;
                }else   //不允许透明和alpha,区域加入窗口可视域,从临时链表删除
                {
                    if(clip == clip_head)
                        clip_head = clip_head->next;
                    clip1 = clip;
                    clip->previous->next = clip->next;
                    clip->next->previous = clip->previous;
                    temp--;
                }
                clip = clip->next;
                //把小clip加入到visible_clip队列中
                __gk_clip_connect(&tempwin->visible_clip,clip1);
            }else       //矩形不在tpwin的可显示范围内,无需处理。
            {
                clip = clip->next;
            }
        }
        __gk_combine_clip_s(tempwin->visible_clip);//合并clip,按先x后y的顺序合并
        if(tempwin != display->desktop)
            tempwin = tempwin->z_back;
        else
            break;
    }
    return true;
}
static GList *
mb_list_albums (SjMetadata *metadata, char **url, GError **error)
{
  SjMetadataMusicbrainz3Private *priv;
  GList *albums = NULL;
  MbQuery query;
  MbReleaseFilter filter;
  MbResultList results;
  MbRelease release;
  char *id = NULL;
  char buffer[1024];
  int i;
  g_return_val_if_fail (SJ_IS_METADATA_MUSICBRAINZ3 (metadata), NULL);

  priv = GET_PRIVATE (metadata);

  if (sj_metadata_helper_check_media (priv->cdrom, error) == FALSE) {
    return NULL;
  }

  priv->disc = mb_read_disc (priv->cdrom);
  if (priv->disc == NULL)
    return NULL;

  if (url != NULL) {
    mb_get_submission_url (priv->disc, NULL, 0, buffer, sizeof (buffer));
    *url = g_strdup (buffer);
  }

  if (g_getenv("MUSICBRAINZ_FORCE_DISC_ID")) {
    id = g_strdup (g_getenv("MUSICBRAINZ_FORCE_DISC_ID"));
  } else {
    GET(id, mb_disc_get_id, priv->disc);
  }

  query = mb_query_new (priv->mb, "sound-juicer");
  filter = mb_release_filter_new ();
  filter = mb_release_filter_disc_id (filter, id);
  results = mb_query_get_releases (query, filter);
  mb_release_filter_free (filter);
  g_free (id);

  if (results == NULL) {
    mb_query_free (query);
    return NULL;
  }

  if (mb_result_list_get_size (results) == 0) {
    mb_result_list_free (results);
    mb_query_free (query);
    return NULL;
  }

  for (i = 0; i < mb_result_list_get_size (results); i++) {
    AlbumDetails *album;
    MbReleaseIncludes includes;
    char buffer[512];

    release = mb_result_list_get_release (results, i);
    if(release) {
      mb_release_get_id (release, buffer, sizeof (buffer));
      includes = get_release_includes ();
      release = mb_query_get_release_by_id (query, buffer, includes);
      if(release) {
        mb_release_includes_free (includes);
        album = make_album_from_release (release);
        album->metadata_source = SOURCE_MUSICBRAINZ;
        fill_empty_durations (priv->disc, album);
        albums = g_list_append (albums, album);
        mb_release_free (release);
      }
    }
  }
  mb_result_list_free (results);
  mb_query_free (query);

  return albums;
}