aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_cdda/DB.Cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_cdda/DB.Cpp')
-rw-r--r--Src/Plugins/Input/in_cdda/DB.Cpp306
1 files changed, 306 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_cdda/DB.Cpp b/Src/Plugins/Input/in_cdda/DB.Cpp
new file mode 100644
index 00000000..71bfdd99
--- /dev/null
+++ b/Src/Plugins/Input/in_cdda/DB.Cpp
@@ -0,0 +1,306 @@
+#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);
+} \ No newline at end of file