PageRenderTime 53ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/Miranda IM - CK Release/Miranda/Delphi/Awkward/mradio/mradio.dpr

http://miranda-dev.googlecode.com/
Pascal | 395 lines | 300 code | 42 blank | 53 comment | 14 complexity | 38275b1f8f071fb5d59e9698fb5e778e MD5 | raw file
Possible License(s): GPL-2.0, MPL-2.0-no-copyleft-exception, LGPL-3.0, AGPL-1.0, BSD-3-Clause, LGPL-2.1
  1. {.$DEFINE CHANGE_NAME_BUFFERED}
  2. {$include compilers.inc}
  3. {$IFDEF COMPILER_16_UP}
  4. {$WEAKLINKRTTI ON}
  5. {.$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
  6. {$ENDIF}
  7. {$IMAGEBASE $13300000}
  8. library MRadio;
  9. uses
  10. // FastMM4,
  11. {$IFDEF KOL_MCK}kol,icobuttons,KOLCCtrls,{$ENDIF}Windows,messages,commctrl
  12. ,common,io,wrapper,wrapdlgs,syswin
  13. ,Dynamic_Bass,dynbasswma
  14. ,m_api,dbsettings,mirutils,playlist;
  15. {$include mr_rc.inc}
  16. {$r mradio.res}
  17. {$include i_vars.inc}
  18. const
  19. cPluginName = 'mRadio';
  20. const
  21. PluginName:PAnsiChar = cPluginName;
  22. var
  23. PluginInterfaces:array [0..1] of MUUID;
  24. const
  25. VersionURL = nil;//'http://addons.miranda-im.org/details.php?action=viewfile&id=3285';
  26. VersionPrefix = nil;//'<span class="fileNameHeader">QuickSearch Mod ';
  27. UpdateURL = nil;//'http://addons.miranda-im.org/feed.php?dlfile=3285';
  28. BetaVersionURL = 'http://awkward.miranda.im/index.htm';
  29. BetaVersionPrefix = '>My mRadio mod ';
  30. BetaUpdateURL = 'http://awkward.miranda.im/mradio.zip';
  31. BetaChangelogURL = nil;
  32. function MakeMessage:pWideChar;
  33. var
  34. p,artist,title:pWideChar;
  35. len:cardinal;
  36. begin
  37. artist:=DBReadUnicode(0,PluginName,optArtist);
  38. title :=DBReadUnicode(0,PluginName,optTitle);
  39. len:=StrLenW(artist);
  40. if (artist<>nil) and (title<>nil) then
  41. inc(len,3);
  42. inc(len,StrLenW(title));
  43. if len>0 then
  44. begin
  45. mGetMem(result,(len+1)*SizeOf(WideChar));
  46. p:=result;
  47. if artist<>nil then
  48. begin
  49. p:=StrCopyEW(p,artist);
  50. if title<>nil then
  51. p:=StrCopyEW(p,' - ');
  52. mFreeMem(artist);
  53. end;
  54. if title<>nil then
  55. begin
  56. StrCopyW(p,title);
  57. mFreeMem(title);
  58. end;
  59. end
  60. else
  61. result:=nil;
  62. end;
  63. procedure SetStatus(hContact:THANDLE;Status:integer);
  64. begin
  65. // if Status=ID_STATUS_OFFLINE then
  66. // MyStopBass;
  67. if Status=ID_STATUS_OFFLINE then
  68. begin
  69. if (AsOffline=BST_UNCHECKED) or (PluginStatus<>ID_STATUS_OFFLINE) then
  70. Status:=ID_STATUS_INVISIBLE;
  71. end;
  72. if hContact=0 then
  73. begin
  74. hContact:=CallService(MS_DB_CONTACT_FINDFIRST,0,0);
  75. while hContact<>0 do
  76. begin
  77. if StrCmp(PAnsiChar(CallService(MS_PROTO_GETCONTACTBASEPROTO,hContact,0)),PluginName)=0 then
  78. begin
  79. DBWriteWord(hContact,PluginName,optStatus,Status);
  80. end;
  81. hContact:=CallService(MS_DB_CONTACT_FINDNEXT,hContact,0);
  82. end;
  83. end
  84. else
  85. DBWriteWord(hContact,PluginName,optStatus,Status);
  86. end;
  87. {$include i_search.inc}
  88. {$include i_bass.inc}
  89. {$include i_cc.inc}
  90. {$include i_variables.inc}
  91. {$include i_service.inc}
  92. {$include i_myservice.inc}
  93. {$include i_hotkey.inc}
  94. {$IFDEF KOL_MCK}
  95. {$include i_frame.inc}
  96. {$ELSE}
  97. {$include i_frameapi.inc}
  98. {$ENDIF}
  99. {$include i_tray.inc}
  100. {$include i_visual.inc}
  101. {$include i_optdlg.inc}
  102. function MirandaPluginInfoEx(mirandaVersion:DWORD):PPLUGININFOEX; cdecl;
  103. begin
  104. result:=@PluginInfo;
  105. PluginInfo.cbSize :=SizeOf(TPLUGININFOEX);
  106. PluginInfo.shortName :='mRadio Mod';
  107. PluginInfo.version :=$00000201;
  108. PluginInfo.description:='This plugin plays and records Internet radio streams.'+
  109. ' Also local media files can be played.';
  110. PluginInfo.author :='Awkward';
  111. PluginInfo.authorEmail:='panda75@bk.ru; awk1975@ya.ru';
  112. PluginInfo.copyright :='(c) 2007-2011 Awkward';
  113. PluginInfo.homepage :='http://code.google.com/p/delphi-miranda-plugins/';
  114. PluginInfo.flags :=UNICODE_AWARE;
  115. PluginInfo.replacesDefaultModule:=0;
  116. PluginInfo.uuid :=MIID_MRADIO;
  117. end;
  118. function OnModulesLoaded(wParam:WPARAM;lParam:LPARAM):int;cdecl;
  119. var
  120. nlu:TNETLIBUSER;
  121. szTemp:array [0..255] of AnsiChar;
  122. i:integer;
  123. upd:TUpdate;
  124. begin
  125. PluginLink^.UnhookEvent(onloadhook);
  126. DBWriteDWord(0,PluginName,optVersion,PluginInfo.version);
  127. if PluginLink^.ServiceExists(MS_UPDATE_REGISTER)<>0 then
  128. begin
  129. with upd do
  130. begin
  131. cbSize :=SizeOf(upd);
  132. szComponentName :=PluginInfo.ShortName;
  133. szVersionURL :=VersionURL;
  134. pbVersionPrefix :=VersionPrefix;
  135. cpbVersionPrefix :=0;//length(VersionPrefix);
  136. szUpdateURL :=UpdateURL;
  137. szBetaVersionURL :=BetaVersionURL;
  138. pbBetaVersionPrefix :=BetaVersionPrefix;
  139. cpbBetaVersionPrefix:=length(pbBetaVersionPrefix);
  140. szBetaUpdateURL :=BetaUpdateURL;
  141. pbVersion :=CreateVersionStringPlugin(@pluginInfo,szTemp);
  142. cpbVersion :=StrLen(pbVersion);
  143. szBetaChangelogURL :=BetaChangelogURL;
  144. end;
  145. PluginLink^.CallService(MS_UPDATE_REGISTER,0,tlparam(@upd));
  146. end;
  147. szTemp[0]:='E';
  148. szTemp[1]:='Q';
  149. szTemp[2]:='_';
  150. szTemp[4]:=#0;
  151. for i:=0 to 9 do
  152. begin
  153. szTemp[3]:=AnsiChar(ORD('0')+i);
  154. eq[i].param.fGain:=DBReadByte(0,PluginName,szTemp,15)-15;
  155. end;
  156. LoadPresets;
  157. RegisterIcons;
  158. CreateMenu;
  159. CreateMIMTrayMenu;
  160. FillChar(nlu,SizeOf(nlu),0);
  161. StrCopy(szTemp,Translate('%s server connection'));
  162. StrReplace(szTemp,'%s',PluginName);
  163. nlu.szDescriptiveName.a:=szTemp;
  164. nlu.cbSize :=SizeOf(nlu);
  165. nlu.flags :=NUF_HTTPCONNS or NUF_NOHTTPSOPTION or NUF_OUTGOING;
  166. nlu.szSettingsModule :=PluginName;
  167. hNetlib:=CallService(MS_NETLIB_REGISTERUSER,0,tlparam(@nlu));
  168. // CallService(MS_RADIO_COMMAND,MRC_RECORD,2); record off - not so necessary
  169. recpath:=DBReadUnicode(0,PluginName,optRecPath);
  170. sPreBuf:=DBReadWord(0,PluginName,optPreBuf,75);
  171. BASS_SetConfig(BASS_CONFIG_NET_PREBUF,sPreBuf);
  172. sBuffer:=DBReadWord(0,PluginName,optBuffer,5000);
  173. BASS_SetConfig(BASS_CONFIG_NET_BUFFER,sBuffer);
  174. sTimeout:=DBReadWord(0,PluginName,optTimeout,5000);
  175. BASS_SetConfig(BASS_CONFIG_NET_TIMEOUT,sTimeout);
  176. doLoop :=DBReadByte(0,PluginName,optLoop);
  177. doShuffle :=DBReadByte(0,PluginName,optShuffle);
  178. doContRec :=DBReadByte(0,PluginName,optContRec);
  179. PlayFirst :=DBReadByte(0,PluginName,optPlay1st);
  180. isEQ_OFF :=DBReadByte(0,PluginName,optEQ_OFF);
  181. AuConnect :=DBReadByte(0,PluginName,optConnect);
  182. AsOffline :=DBReadByte(0,PluginName,optOffline);
  183. gVolume :=DBReadByte(0,PluginName,optVolume,50);
  184. NumTries :=DBReadByte(0,PluginName,optNumTries,1);
  185. ForcedMono:=DBReadByte(0,PluginName,optForcedMono);
  186. if NumTries<1 then NumTries:=1;
  187. SetStatus(0,ID_STATUS_OFFLINE);
  188. StatusTmpl:=DBReadUnicode(0,PluginName,optStatusTmpl,'%radio_title%');
  189. CallService(MS_RADIO_COMMAND,MRC_STATUS,RD_STATUS_NOSTATION);
  190. RegisterVariables;
  191. if Auconnect<>BST_UNCHECKED then
  192. ActiveContact:=LoadContact(PluginName,optLastStn)
  193. else
  194. ActiveContact:=0;
  195. onsetting:=Pluginlink^.HookEvent(ME_DB_CONTACT_SETTINGCHANGED,@OnSettingsChanged);
  196. ondelete :=PluginLink^.HookEvent(ME_DB_CONTACT_DELETED ,@OnContactDeleted);
  197. randomize;
  198. CreateFrame(0);
  199. RegisterHotKey;
  200. result:=0;
  201. end;
  202. function PreShutdown(wParam:WPARAM;lParam:LPARAM):int;cdecl;
  203. {
  204. var
  205. buf:array [0..MAX_PATH-1] of AnsiChar;
  206. fdata:WIN32_FIND_DATAA;
  207. p:pAnsiChar;
  208. fi:THANDLE;
  209. }
  210. begin
  211. CallService(MS_RADIO_COMMAND,MRC_STOP,1);
  212. UnRegisterHotKey;
  213. DestroyProtoServices;
  214. DestroyWindow(hiddenwindow);
  215. DestroyFrame();
  216. MyFreeBASS;
  217. DBWriteByte(0,PluginName,optVolume,gVolume);
  218. with PluginLink^ do
  219. begin
  220. DestroyServiceFunction(hsTrayMenu);
  221. DestroyServiceFunction(hsPlayStop);
  222. DestroyServiceFunction(hsRecord);
  223. DestroyServiceFunction(hsSettings);
  224. DestroyServiceFunction(hsSetVol);
  225. DestroyServiceFunction(hsGetVol);
  226. DestroyServiceFunction(hsMute);
  227. DestroyServiceFunction(hsCommand);
  228. DestroyServiceFunction(hsEqOnOff);
  229. DestroyServiceFunction(hsExport);
  230. DestroyServiceFunction(hsImport);
  231. DestroyHookableEvent(hhRadioStatus);
  232. UnhookEvent(onsetting);
  233. UnhookEvent(ondelete);
  234. UnhookEvent(hHookShutdown);
  235. UnhookEvent(hDblClick);
  236. UnhookEvent(opthook);
  237. UnhookEvent(contexthook);
  238. end;
  239. CallService(MS_NETLIB_CLOSEHANDLE,hNetLib,0);
  240. mFreeMem(storage);
  241. mFreeMem(storagep);
  242. mFreeMem(recpath);
  243. mFreeMem(StatusTmpl);
  244. mFreeMem(basspath);
  245. FreePresets;
  246. {
  247. //delete cover files
  248. buf[0]:=#0;
  249. GetTempPathA(MAX_PATH,buf);
  250. p:=StrEnd(buf);
  251. StrCopy(p,'mrAvt*.*');
  252. fi:=FindFirstFileA(buf,fdata);
  253. if fi<>THANDLE(INVALID_HANDLE_VALUE) then
  254. begin
  255. repeat
  256. StrCopy(p,fdata.cFileName);
  257. DeleteFileA(buf);
  258. until not FindNextFileA(fi,fdata);
  259. FindClose(fi);
  260. end;
  261. }
  262. result:=0;
  263. end;
  264. function Load(link:PPLUGINLINK): int; cdecl;
  265. var
  266. desc:TPROTOCOLDESCRIPTOR;
  267. szTemp:array [0..MAX_PATH-1] of WideChar;
  268. pc:pWideChar;
  269. custom:pWideChar;
  270. begin
  271. PluginLink:=Pointer(link);
  272. InitMMI;
  273. Langpack_register;
  274. GetModuleFileNameW(0,szTemp,MAX_PATH-1);
  275. pc:=StrEndW(szTemp);
  276. repeat
  277. dec(pc);
  278. until pc^='\';
  279. inc(pc);
  280. pc^:=#0;
  281. custom:=DBReadUnicode(0,PluginName,optBASSpath,nil);
  282. if MyLoadBASS(szTemp,custom) then
  283. begin
  284. StrCopyW(pc,'plugins\mradio.ini');
  285. // StrDup(storage,szTemp);
  286. FastWideToAnsi(szTemp,storage);
  287. mGetMem(storagep,MAX_PATH+32);
  288. CallService(MS_DB_GETPROFILEPATH,MAX_PATH-1,lparam(storagep));
  289. StrCat(storagep,'\mradio.ini');
  290. FillChar(desc,SizeOf(desc),0);
  291. desc.cbSize:=PROTOCOLDESCRIPTOR_V3_SIZE;//SizeOf(desc);
  292. desc.szName:=PluginName;
  293. desc._type :=PROTOTYPE_PROTOCOL;
  294. CallService(MS_PROTO_REGISTERMODULE,0,lparam(@desc));
  295. with PluginLink^ do
  296. begin
  297. hhRadioStatus:=PluginLink^.CreateHookableEvent(ME_RADIO_STATUS);
  298. hsPlayStop:=CreateServiceFunction(MS_RADIO_PLAYSTOP,@Service_RadioPlayStop);
  299. hsRecord :=CreateServiceFunction(MS_RADIO_RECORD ,@Service_RadioRecord);
  300. hsSettings:=CreateServiceFunction(MS_RADIO_SETTINGS,@Service_RadioSettings);
  301. hsSetVol :=CreateServiceFunction(MS_RADIO_SETVOL ,@Service_RadioSetVolume);
  302. hsGetVol :=CreateServiceFunction(MS_RADIO_GETVOL ,@Service_RadioGetVolume);
  303. hsMute :=CreateServiceFunction(MS_RADIO_MUTE ,@Service_RadioMute);
  304. hsCommand :=CreateServiceFunction(MS_RADIO_COMMAND ,@ControlCenter);
  305. hsEqOnOff :=CreateServiceFunction(MS_RADIO_EQONOFF ,@Service_EqOnOff);
  306. hiddenwindow:=CreateHiddenWindow;
  307. hsTrayMenu:=CreateServiceFunction(MS_RADIO_TRAYMENU,@CreateTrayMenu);
  308. hsExport :=CreateServiceFunction(MS_RADIO_EXPORT ,@ExportAll);
  309. hsImport :=CreateServiceFunction(MS_RADIO_IMPORT ,@ImportAll);
  310. CreateProtoServices;
  311. onloadhook :=HookEvent(ME_SYSTEM_MODULESLOADED ,@OnModulesLoaded);
  312. hHookShutdown:=HookEvent(ME_SYSTEM_SHUTDOWN{ME_SYSTEM_OKTOEXIT},@PreShutdown);
  313. hDblClick :=HookEvent(ME_CLIST_DOUBLECLICKED ,@Service_RadioPlayStop{@DblClickProc});
  314. opthook :=HookEvent(ME_OPT_INITIALISE ,@OnOptInitialise);
  315. contexthook :=HookEvent(ME_CLIST_PREBUILDCONTACTMENU,@OnContactMenu);
  316. end;
  317. PluginStatus:=ID_STATUS_OFFLINE;
  318. end;
  319. mFreeMem(custom);
  320. Result:=0;
  321. end;
  322. function Unload: int; cdecl;
  323. begin
  324. Unload_BASSDLL;
  325. Result:=0;
  326. end;
  327. function MirandaPluginInterfaces:PMUUID; cdecl;
  328. begin
  329. PluginInterfaces[0]:=PluginInfo.uuid;
  330. PluginInterfaces[1]:=MIID_LAST;
  331. result:=@PluginInterfaces;
  332. end;
  333. exports
  334. Load, Unload,
  335. MirandaPluginInterfaces,MirandaPluginInfoEx;
  336. begin
  337. end.