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); */ }
//----扫描可视域--------------------------------------------------------------- //功能: 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; }