123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- #include "main.h"
- #include "cddb.h"
- #include "../Winamp/wa_ipc.h"
- #include "../nu/AutoChar.h"
- #include "../nu/AutoWide.h"
- #include "api__in_cdda.h"
- #include <api/service/waservicefactory.h>
- #include <shlwapi.h>
- #include <atlbase.h>
- #include "resource.h"
- #include <commctrl.h>
- #include <strsafe.h>
- char config_use_cddb = 1;
- #define MAX_CACHE_SIZE 8
- typedef struct _CBDATA
- {
- DINFO *ps;
- CHAR cLetter;
- DWORD cddbid;
- } CBDATA;
- typedef struct _CACHEREC
- {
- DINFO discInfo;
- HRESULT result;
- } CACHEREC;
- static CACHEREC cddb_cache[MAX_CACHE_SIZE];
- static int cddb_cache_cursor = 0;
- void DefaultValues(DINFO *ps)
- {
- ps->Reset();
- ps->compilation = false;
- ps->discnum = 0;
- ps->numdiscs = 0;
- ps->populated = true;
- }
- static bool IsInternetAvailable()
- {
- return !!SendMessage(line.hMainWindow, WM_WA_IPC, 0, IPC_INETAVAILABLE);
- }
- static DWORD failid[26] ={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- #define WRITEINFO(obj, field, name) { obj->get_ ## field(&str); fwprintf(fp, name L": %s\r\n", str.m_str); }
- #define WRITEINFO_LONG(obj, field, name) { long val; obj->get_ ## field(&val); fwprintf(fp, name L": %d\r\n", val); }
- #ifndef IGNORE_API_GRACENOTE
- static void DumpInfoFile(ICddbDiscPtr disc)
- {
- #if 0 // keep this code, but we'll wait until a later version to implement more data
- long numTracks;
- FILE *fp = fopen("c:\\cdinfo.txt", "wt");
- // wchar_t BOM[] = {0xFEFF, 0};
- // fwrite(BOM, 2, 1, fp);
- CComBSTR str;
- WRITEINFO(disc, Toc, L"Disc TOC");
- WRITEINFO(disc, Artist, L"Disc Artist");
- WRITEINFO(disc, Title, L"Disc Title");
- WRITEINFO(disc, Label, L"Disc Label");
- WRITEINFO(disc, Year, L"Disc Year");
- WRITEINFO(disc, MediaId, L"Disc MediaId");
- WRITEINFO(disc, Notes, L"Disc Notes");
- WRITEINFO(disc, GenreId, L"Disc GenreId");
- WRITEINFO(disc, SecondaryGenreId, L"Disc Secondary GenreId");
- WRITEINFO(disc, RegionId, L"Disc RegionId");
- WRITEINFO(disc, Revision, L"Disc Revision");
- WRITEINFO(disc, TotalInSet, L"Disc Discs");
- WRITEINFO(disc, NumberInSet, L"Disc Disc #");
- WRITEINFO(disc, LanguageId, L"Disc Language Id");
- WRITEINFO(disc, RevisionTag, L"Disc Revision Tag");
- WRITEINFO_LONG(disc, Compilation, L"Disc Compilation");
- ICddbDisc2 *disc2;
- disc->QueryInterface(&disc2);
- WRITEINFO(disc2, ReleaseDate, L"Disc Release Date");
- WRITEINFO(disc2, RecordingDate, L"Disc Recording Date");
- WRITEINFO(disc2, ProductCode, L"Disc Product Code");
- WRITEINFO(disc2, YearComposed, L"Disc Year Composed");
- disc2->Release();
- ICddbCredits *credits;
- disc->get_Credits(&credits);
- long creditCount;
- credits->get_Count(&creditCount);
- for (long c = 0;c < creditCount;c++)
- {
- ICddbCredit *credit;
- credits->GetCredit(c + 1, &credit);
- WRITEINFO(credit, Id, L"Credit ID");
- WRITEINFO(credit, Name, L"Credit Name");
- WRITEINFO(credit, Notes, L"Credit Notes");
- credit->Release();
- }
- credits->Release();
- ICddbTracks *tracks;
- disc->get_Tracks(&tracks);
- tracks->get_Count(&numTracks);
- for (int i = 0;i < numTracks;i++)
- {
- ICddbTrack *track;
- tracks->GetTrack(i + 1, &track);
- fputws(L"-----------------\r\n", fp);
- WRITEINFO(track, Title, L"Track Title");
- WRITEINFO(track, Artist, L"Track Artist");
- WRITEINFO(track, Year, L"Track Year");
- WRITEINFO(track, Label, L"Track Label");
- WRITEINFO(track, Notes, L"Track Notes");
- WRITEINFO(track, GenreId, L"Track GenreId");
- WRITEINFO(track, SecondaryGenreId, L"Track SecondaryGenreId");
- WRITEINFO(track, Lyrics, L"Track Lyrics");
- WRITEINFO(track, BeatsPerMinute, L"Track BPM");
- WRITEINFO(track, ISRC, L"Track ISRC");
- ICddbTrack2 *track2;
- track->QueryInterface(&track2);
- WRITEINFO(track2, ReleaseDate, L"Release Date");
- WRITEINFO(track2, RecordingDate, L"Recording Date");
- WRITEINFO(track2, YearComposed, L"Year Composed");
- track2->Release();
- ICddbCredits *credits;
- track->get_Credits(&credits);
- if (credits)
- {
- long creditCount;
- credits->get_Count(&creditCount);
- for (long c = 0;c < creditCount;c++)
- {
- ICddbCredit *credit;
- credits->GetCredit(c + 1, &credit);
- WRITEINFO(credit, Id, L"Credit ID");
- WRITEINFO(credit, Name, L"Credit Name");
- WRITEINFO(credit, Notes, L"Credit Notes");
- credit->Release();
- }
- credits->Release();
- }
- track->Release();
- }
- tracks->Release();
- fclose(fp);
- #endif
- }
- #endif
- #ifdef IGNORE_API_GRACENOTE
- static HRESULT CALLBACK Cddb_ResultCallback(HRESULT result, ICddbDisc *pDisc, DWORD *pdwAutoCloseDelay, ULONG_PTR user)
- {
- int index;
- CACHEREC *pRec;
- CBDATA *pData = (CBDATA*)user;
- if (!pData) return E_POINTER;
- DINFO *pDI = NULL;
- for (index = 0, pRec = &cddb_cache[0]; index < MAX_CACHE_SIZE && 0 != pRec->discInfo.CDDBID; pRec++, index++)
- {
- if (pRec->discInfo.CDDBID == pData->cddbid)
- {
- pDI = &pRec->discInfo;
- break;
- }
- }
- if (!pDI) return S_OK;
- if (S_OK == result)
- {
- #ifndef IGNORE_API_GRACENOTE
- if (pDisc)
- {
- DumpInfoFile(pDisc);
- GetDiscInfo(pDisc, pDI);
- StoreDisc(pDI->CDDBID, pDisc);
- ICddbCacheManager* pCache;
- HRESULT hr = Cddb_GetICacheManger((void**)&pCache);
- if (SUCCEEDED(hr))
- {
- CComBSTR toc;
- pDisc->get_Toc(&toc);
- pCache->StoreDiscByToc(toc, pDisc);
- pCache->Release();
- }
- pDI->populated = true;
- }
- #endif
- }
- else
- {
- #ifndef IGNORE_API_GRACENOTE
- if (DoCDText(pDI, pData->cLetter))
- {
- StoreCDText(pDI->CDDBID, pData->cLetter);
- result = S_OK;
- }
- #endif
- }
- CddbCache_SetDisc(pDI, result);
- if (pData->ps->CDDBID == pDI->CDDBID)
- {
- *pData->ps = *pDI;
- }
- return S_OK;
- }
- #endif
- void InitializeCddbCache(void)
- {
- ZeroMemory(cddb_cache, sizeof(CACHEREC)*MAX_CACHE_SIZE);
- cddb_cache_cursor = 0;
- }
- void UninitializeCddbCache(void)
- {
- ZeroMemory(cddb_cache, sizeof(CACHEREC)*MAX_CACHE_SIZE);
- cddb_cache_cursor = 0;
- }
- HRESULT CddbCache_SetDisc(DINFO *pDiscInfo, HRESULT lookupResult)
- {
- int index;
- CACHEREC *pRec;
- if (!pDiscInfo || 0 == pDiscInfo->CDDBID) return E_FAIL;
- for (index = 0, pRec = &cddb_cache[0]; index < MAX_CACHE_SIZE && 0 != pRec->discInfo.CDDBID; pRec++, index++)
- {
- if (pRec->discInfo.CDDBID == pDiscInfo->CDDBID) break;
- }
- if (0 == pRec->discInfo.CDDBID || MAX_CACHE_SIZE == index)
- {
- pRec = &cddb_cache[cddb_cache_cursor];
- cddb_cache_cursor++;
- if (cddb_cache_cursor >= MAX_CACHE_SIZE) cddb_cache_cursor = 0;
- }
- if (pRec)
- {
- pRec->result = lookupResult;
- pRec->discInfo = *pDiscInfo;
- }
- return S_OK;
- }
- int GetCDDBInfo(DINFO *ps, wchar_t device)
- {
- int index;
- CACHEREC *pRec;
- //HRESULT hr;
- //wchar_t szTOC[2048] = {0};
- if (ps->populated) return 0;
- /* first, look in our memory cache */
- for (index = 0, pRec = &cddb_cache[0]; index < MAX_CACHE_SIZE && 0 != pRec->discInfo.CDDBID; pRec++, index++)
- {
- if (pRec->discInfo.CDDBID == ps->CDDBID)
- {
- if (S_OK == pRec->result)
- *ps = pRec->discInfo;
- else
- DefaultValues(ps);
- return 0; // no need to notify about changes
- }
- }
- /* look it up in the local database */
- if (QueryDINFO(ps->CDDBID, ps))
- {
- CddbCache_SetDisc(ps, S_OK);
- return 0;
- }
- /* check CDDB & CD-Text */
- /*CddbCache_SetDisc(ps, E_PENDING);
- if (Cddb_CalculateTOC(ps, szTOC, sizeof(szTOC)/sizeof(wchar_t)))
- {
- ULONG flags;
- CBDATA data;
- data.ps = ps;
- data.cLetter = device;
- data.cddbid = ps->CDDBID;
- flags = CDDB_UI_MODAL | CDDB_UI_MULTIPLE | CDDB_UI_NOMATCH;
- if (!config_use_cddb || !IsInternetAvailable()) flags |= CDDB_NOINET;
- hr = Cddb_DoLookup(szTOC, line.hMainWindow, Cddb_ResultCallback, flags, (ULONG_PTR)&data);
- if (FAILED(hr)) Cddb_DisplayResultDlg(line.hMainWindow, hr, AUTOCLOSE_NEVER, flags);
- }
- else hr = CDDB_E_BADTOC;
- if (FAILED(hr)) CddbCache_SetDisc(ps, hr);*/
- return 1;//SUCCEEDED(hr);
- }
|