From pouchintv-dev at baysse.fr Fri Dec 4 11:55:44 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Fri, 04 Dec 2009 10:55:44 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r209 - trunk Message-ID: <20091204105532.544595F761@mail.baysse.fr> Author: gingko Date: 2009-12-04 11:55:31 +0100 (ven 04 déc 2009) New Revision: 209 Modified: trunk/Doxyfile trunk/config.h trunk/filters.cpp trunk/filters.h trunk/ini.cpp trunk/mpeg2defs.h trunk/parse.cpp trunk/search.cpp trunk/search.h trunk/utils.cpp trunk/utils.h Log: Factorisations et nettoyages divers (prémisses à des changements plus importants) filters.h, filters.cpp, search.h, search.cpp : * Factorisation concernant la recherche de filtres exploitant des interfaces de type "IMoniker" : création d'une classe "MonikerBindings" regroupant toutes les fonctionnalités liées à ce type d'objet. * Utilisation de cette classe "MonikerBindings" pour passer les résultats successifs des énumérations de filtres dans la recherche. * La structure "VarStr_helper" est déplacée dans "filters.cpp", puisque maintenant c'est là qu'elle est utilisée. ini.cpp : * Petite factorisation ("CConfigFile::PlatformAdjust") * Ajout d'une certaines gestion d'erreurs dans la classe "CIniFile". * Nettoyages de commentaires mpeg2defs.h, parse.cpp : * Ajustements et renommage concernant les flux E-AC3 utils.h, utils.cpp : * Ajout de déclinaisons spécifiques de "strcpy_T" pour copies vers des variables de type string / wstring / tstring. config.h : * Ajustements et ajouts de commentaires. Doxyfile : * Suppression du chemin vers l'application Graphviz (car celui-ci posait problème après changement de version de ce logiciel). Il est donc maintenant indispensable que l'application "dot.exe" soit accessible via la variable d'environnement "PATH". Modifié: trunk/Doxyfile =================================================================== --- trunk/Doxyfile 2009-11-11 17:50:32 UTC (rev 208) +++ trunk/Doxyfile 2009-12-04 10:55:31 UTC (rev 209) @@ -1235,11 +1235,8 @@ # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. -DOT_PATH = "C:/Program Files/Graphviz 2.21/bin" +DOT_PATH = -# Attention : sur un OS 64 bits, ce rpertoire devrait tre le suivant : -# DOT_PATH = "C:/Program Files (x86)/Graphviz 2.21/bin" - # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). Modifié: trunk/config.h =================================================================== --- trunk/config.h 2009-11-11 17:50:32 UTC (rev 208) +++ trunk/config.h 2009-12-04 10:55:31 UTC (rev 209) @@ -38,21 +38,39 @@ // Options diverses // ==================================================================================== -#ifndef USE_LOGITECH_LCD // (ignorer si dfini par le projet) - /// Activation du LCD Logitech si la macro est dfinie - #define USE_LOGITECH_LCD - #undef USE_LOGITECH_LCD // (#undef pour que Doxygen accepte de documenter cette macro) +/** + * Activation / dsactivation du LCD Logitech + **/ +#ifdef USE_LOGITECH_LCD // (si dfini par le projet) + #undef USE_LOGITECH_LCD + #define USE_LOGITECH_LCD 1 +#else + #ifdef _DEBUG + #define USE_LOGITECH_LCD 1 + #else + #define USE_LOGITECH_LCD 0 + #endif #endif // ==================================================================================== // Options lies au graphe // ==================================================================================== -#define USE_AUTO_RETUNE 1 //!< Resyntonisation automatique +/** + * Activation / dsactivation de la resyntonisation automatique. + **/ +#define USE_AUTO_RETUNE 1 -#define USE_PMTFILTER 1 //!< Activation/dsactivation filtre PMT +/** + * Activation / dsactivation de l'utilisation du filtre PMT + **/ +#define USE_PMTFILTER 1 -#define EXPORT_GRAPH 1 //!< Exportation du graphe (pour Graphedit) +/** + * Macro permettant d'activer ou de dsactiver l'exportation du graphe + * ( l'usage de Graphedit ou d'un logiciel quivalent, genre GraphStudio). + **/ +#define EXPORT_GRAPH 1 /** * Macro visant simuler l'existence d'une radio numrique RNT du style de celles qui existent @@ -74,11 +92,13 @@ **/ #define AUTO_RENDER 0 /*!< \brief Recherche automatique de filtres appropris en cas d'chec de l'insertion du filtre initialement prvu */ + +/** + * Activation / dsactivation de la journalisation dans DirectShow + **/ #ifdef _DEBUG - /// Enregistrer DShow #define LOG_DSHOW 1 #else - /// on ne logue pas les vnements DShow #define LOG_DSHOW 0 #endif Modifié: trunk/filters.cpp =================================================================== --- trunk/filters.cpp 2009-11-11 17:50:32 UTC (rev 208) +++ trunk/filters.cpp 2009-12-04 10:55:31 UTC (rev 209) @@ -175,6 +175,108 @@ } // ==================================================================================== +// Assistance la recherche de filtres +// ==================================================================================== + +// Structure d'assistance la rcupration d'une chane de caratres depuis une variable de type +// VARIANT (permet en particulier de nettoyer la chane au passage, pour corriger un problme +// constat avec certains tuners): +struct VarStr_helper +{ + TCHAR str[128]; + + /// Constructeur + VarStr_helper(const VARIANT & var); + + /// Rcupration du rsultat + LPCTSTR operator () () const { + return str;} +}; + +/// Constructeur +VarStr_helper::VarStr_helper(const VARIANT & var) +{ + if (var.vt==VT_BSTR) { + strcpy_T(str, var.bstrVal); + str[_countof(str)-1] = 0; // prcaution + + size_t len = strlen_T(str); + + while (len>0 && str[--len]<=' ') + str[len] = 0; + } else + str[0] = 0; +} + +/** + * Constructeur partir d'une numration. + * \param[in] pMonikr Pointeur vers l'interface "Moniker" numre + * \param[in] phr Pointeur sur variable o mettre le code retour si non NULL + **/ +MonikerBindings::MonikerBindings(IMoniker * pMonikr, HRESULT * phr) : + pMoniker(pMonikr) +{ + HRESULT hr = CreateBindCtx(0, &pBindCtx); + + if (SUCCEEDED(hr)) + hr = BindProperties(); + + if (phr) + *phr = hr; +} + +class CErrorLog : public IErrorLog +{ +public: + // Implmentation triviale des mthodes (abstraites) de l'interface \p IUnknown + virtual STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv) { + return NULL; } + + virtual STDMETHODIMP_(ULONG) AddRef() { + return 0; } + + virtual STDMETHODIMP_(ULONG) Release() { + return 0; } + + virtual HRESULT STDMETHODCALLTYPE AddError(LPCOLESTR pszPropName, EXCEPINFO *pExcepInfo) { + return S_OK; } +}; + +/// Rcupration \p IPropertyBag et nom du filtre +HRESULT MonikerBindings::BindProperties() +{ + CErrorLog cErrLog; + + pPropBag.Release(); // Au cas o on appellerait une seconde fois cette mthode + + HRESULT hr = pMoniker->BindToStorage(pBindCtx, 0, IID_IPropertyBag, reinterpret_cast(&pPropBag)); + myprintf(CMyP ERRX(TEXT("Erreur BindToStorage, hr=0x%08x")), FAILED(hr), hr); + if (SUCCEEDED(hr)) { + CComVariant varName; + + hr = pPropBag->Read(L"FriendlyName", &varName, &cErrLog); + myprintf(CMyP ERRX(TEXT("Erreur Lecture nom du filtre, hr=0x%08x")), FAILED(hr), hr); + + if (SUCCEEDED(hr)) + strcpy_T(strName, VarStr_helper(varName)()); + } + + return hr; +} + +/** + * Charger l'interface du filtre dans \p pFilter (non ralis la construction car pas + * toujours requis et parfois gnant). + * \return Code d'erreur DirectShow + **/ +HRESULT MonikerBindings::BindToFilter() +{ + HRESULT hr = pMoniker->BindToObject(pBindCtx, NULL, IID_IBaseFilter, reinterpret_cast(&pFilter)); + myprintf(CMyP ERRX(TEXT("Erreur BindToObject, hr=0x%08x")), FAILED(hr), hr); + return hr; +} + +// ==================================================================================== // Recherche de broche dans un filtre // ==================================================================================== Modifié: trunk/filters.h =================================================================== --- trunk/filters.h 2009-11-11 17:50:32 UTC (rev 208) +++ trunk/filters.h 2009-12-04 10:55:31 UTC (rev 209) @@ -74,6 +74,14 @@ LPFNNewCOMObject procCrea; //!< Fonction de cration du filtre si interne }; + /// Constructeur pour filtre dj instanci + FilterData(LPCTSTR pszNam=NULL, IBaseFilter * pFiltr=NULL) : + pFilter(pFiltr), + pszName(pszNam), + bLocal(false), + pclsid(NULL) + {} + /// Constructeur pour filtre externe (COM) FilterData(LPCTSTR pszNam, REFCLSID clsid) : pszName(pszNam), @@ -88,6 +96,14 @@ procCrea(proc) {} + /// Constructeur copie + FilterData(const FilterData & sFltFrom) : + pFilter(sFltFrom.pFilter), + pszName(sFltFrom.pszName), + bLocal(sFltFrom.bLocal), + pclsid(sFltFrom.pclsid) + {} + /** * \brief Cration du filtre **/ @@ -184,6 +200,42 @@ }; // ==================================================================================== +// Assistance la recherche de filtres +// ==================================================================================== + +/// Classe d'assistance l'interprtation des rsultats d'une recherche de filtres +class MonikerBindings +{ + /// Rcupration \p IPropertyBag et nom du filtre + HRESULT BindProperties(); + +public: + CComPtr pMoniker; //!< Pointeur vers l'interface "Moniker" + CComPtr pBindCtx; //!< Pointeur vers l'interface "Bind context" + CComPtr pPropBag; //!< Pointeur vers l'interface "Property bag" + CComPtr pFilter; //!< Pointeur vers l'interface du filtre, si requis + tstring strName; //!< Nom du filtre + + /** + * Constructeur partir d'une numration. + * \param[in] pMonikr Pointeur vers l'interface "Moniker" numre + * \param[in] phr Pointeur sur variable o mettre le code retour si non NULL + **/ + MonikerBindings(IMoniker * pMonikr, HRESULT * phr = NULL); + + /** + * Charger l'interface du filtre dans \p pFilter (non ralis la construction car pas + * toujours requis et parfois gnant). + * \return Code d'erreur DirectShow + **/ + HRESULT BindToFilter(); + + /// Test validit des donnes + bool isOk() const { + return pPropBag && !strName.empty();} +}; + +// ==================================================================================== // Recherche de broche dans un filtre // ==================================================================================== Modifié: trunk/ini.cpp =================================================================== --- trunk/ini.cpp 2009-11-11 17:50:32 UTC (rev 208) +++ trunk/ini.cpp 2009-12-04 10:55:31 UTC (rev 209) @@ -169,7 +169,7 @@ bool allow_stream_record = false; bool use_msn = false; -extern TCHAR titre_fenetre[128] = TEXT(""); +TCHAR titre_fenetre[128] = TEXT(""); bool on_top = false; bool use_ac3 = false; bool use_osd = true; @@ -513,14 +513,14 @@ /// Item de slection du tuner lui-mme static ConfigItem ini_tuner = { - TEXT("Tuner TNT"), cit_DRV, NULL, CONFIG_STR(nom_tuner) + TEXT("Tuner TNT"), cit_DRV, CONFIG_VAL(NULL_NAME), CONFIG_STR(nom_tuner) }; /// Liste des items sauvegards sparment pour chaque type de tuner static ConfigItem ini_tuner_items[] = { // Nom Type Dfaut Variable - // Rcepteur TNT en premire position ( cause d'une fonction qui l'utilise via l'index 0) - {TEXT("Rcepteur TNT"), cit_DRV, NULL, CONFIG_STR(nom_receiver)}, + // Rcepteur TNT (en fait filtre de capture) en premire position ( cause d'une fonction qui l'utilise via l'index 0) + {TEXT("Rcepteur TNT"), cit_DRV, CONFIG_VAL(NULL_NAME), CONFIG_STR(nom_receiver)}, // {TEXT("Offset tuner"), cit_INT, 0, & offset_tuner}, {TEXT("Essayer +5 kHz si chec"), cit_BOOL, INI_TRY_ADDING_5KHZ_DEFAULT, & try_adding_5khz}, @@ -849,9 +849,11 @@ NomFichierConf sIniFilePathName; protected: TCHAR szSectionName[128]; + DWORD dwError; public: CIniFile(LPCTSTR pszFileName, bool bUsePrefix=true, LPCTSTR pszDir=pouchindir_conf) : - sIniFilePathName(pszFileName, bUsePrefix, pszDir) + sIniFilePathName(pszFileName, bUsePrefix, pszDir), + dwError(0) { szSectionName[0] = 0; } @@ -925,11 +927,11 @@ /** * Cherche une chane de caractres dans le fichier de configuration * - * \param[in] lpKeyName nom de l'option rechercher - * \param[out] lpValue valeur recherche - * \param[in] bufSize nombre de caractres dans la chane de retours - * \param[in] lpDefault valeur par dfaut, si on n'a rien trouv - * \return Nombre de caractres copis, sans tenir compte du caractre '\\0' + * \param[in] lpKeyName nom de l'option rechercher + * \param[out] lpValue valeur recherche + * \param[in] bufSize nombre de caractres dans la chane de retours + * \param[in] lpDefault valeur par dfaut, si on n'a rien trouv + * \return Nombre de caractres copis, sans tenir compte du caractre '\\0' **/ DWORD load_str(LPCTSTR lpKeyName, LPTSTR lpValue, DWORD bufSize, LPCTSTR lpDefault=TEXT("")); @@ -945,7 +947,7 @@ /** * Cherche une valeur numrique dans le fichier de configuration * - * \param[in] lpKeyName nom de l'option rechercher + * \param[in] lpKeyName nom de l'option rechercher * \param[in] nDefault valeur par dfaut, si on n'a rien trouv * \return valeur recherche (trouve, ou par dfaut) **/ @@ -954,7 +956,7 @@ /** * Cherche une valeur numrique, en convertissant la valeur textuelle contenue dans le fichier de configuration * - * \param[in] lpKeyName nom de l'option rechercher + * \param[in] lpKeyName nom de l'option rechercher * \param[in] assocTable tableau associatif contenant les faleurs rechercher * \param[in] bydefault valeur par dfaut, si on n'a rien trouv * \return valeur recherche (trouve, ou par dfaut) @@ -964,7 +966,7 @@ /** * Charge une valeur binaire dans le fichier de configuration, en convertissant les valeurs textuelles * - * \param[in] lpKeyName nom de l'option rechercher + * \param[in] lpKeyName nom de l'option rechercher * \param[in] bydefault valeur par dfaut, si on n'a rien trouv * \return valeur recherche (trouve, ou par dfaut) **/ @@ -1015,7 +1017,20 @@ **/ BOOL CIniFile::save_str(LPCTSTR lpKeyName, LPCTSTR lpString) { - return WritePrivateProfileString(szSectionName, lpKeyName, lpString, sIniFilePathName); + if (dwError) + return FALSE; + + BOOL bRes = WritePrivateProfileString(szSectionName, lpKeyName, lpString, sIniFilePathName); + + if (!bRes) { + // Une erreur a toutes les chances de se rpter pour toutes les critures dans le mme + // fichier, donc on ne retente pas tant que le fichier n'a pas chang. + dwError = GetLastError(); + + myprintf(ERRX(TEXT("Erreur criture dans :") EOL TEXT("%s :") EOL TEXT("%s")), + (LPCTSTR)sIniFilePathName, SystemErrorToString(dwError).c_str()); + } + return bRes; } /** @@ -1080,7 +1095,7 @@ /** * Cherche une chane de caractres dans le fichier de configuration * - * \param[in] lpKeyName nom de l'option rechercher + * \param[in] lpKeyName nom de l'option rechercher * \param[out] lpValue valeur recherche * \param[in] bufSize nombre de caractres dans la chane de retours * \param[in] lpDefault valeur par dfaut, si on n'a rien trouv @@ -1094,7 +1109,7 @@ /** * Cherche une valeur numrique dans le fichier de configuration * - * \param[in] lpKeyName nom de l'option rechercher + * \param[in] lpKeyName nom de l'option rechercher * \param[in] nDefault valeur par dfaut, si on n'a rien trouv * \return valeur recherche (trouve, ou par dfaut) **/ @@ -1122,7 +1137,7 @@ /** * Charge une valeur binaire dans le fichier de configuration, en convertissant les valeurs textuelles * - * \param[in] lpKeyName nom de l'option rechercher + * \param[in] lpKeyName nom de l'option rechercher * \param[in] bydefault valeur par dfaut, si on n'a rien trouv * \return valeur recherche (trouve, ou par dfaut) **/ @@ -1146,8 +1161,15 @@ NewSection(ini_config_section); // Section initiale, par dfaut } + /** + * Ajustement d'un nom de cl selon la plateforme utilise + * \param[in] pszKey Nom de la cl devant tre ajuste + * \param[in] nBufSize Taille du tampon qui la contient + **/ + void PlatformAdjust(LPTSTR pszKey, UINT32 nBufSize); + /// Slection d'une nouvelle section base sur un nom de tuner - CConfigFile & CConfigFile::NewTunerSection(LPCTSTR pszTunerName); + CConfigFile & NewTunerSection(LPCTSTR pszTunerName); /** * Sauve un nom de pilote pass en paramtre. @@ -1173,7 +1195,7 @@ /** * Charge les donnes spcifiques au tuner configur - */ + **/ void load_tuner_config(); /** @@ -1224,7 +1246,7 @@ * Cherche un nom de pilote dans le fichier de configuration. * Gre le cas de la prsence d'un debugger. * - * \param[in] lpKeyName nom de l'option rechercher + * \param[in] lpKeyName nom de l'option rechercher * \param[out] lpValue valeur recherche * \param[in] bufSize nombre de caractres dans la chane de retours * \return Nombre de caractres copis, sans tenir compte du caractre '\\0' @@ -1243,7 +1265,7 @@ /** * Charge la taille/position de la fentre dans le fichier de configuration * - * \param[in] lpKeyName nom de l'option rechercher + * \param[in] lpKeyName nom de l'option rechercher * \param[out] wpos structure retournant la taille trouve, ou initialise avec les valeurs par dfaut * \param[in] defL largeur par dfaut, si pas trouv * \param[in] defH hauteur par dfaut, si pas trouv @@ -1964,6 +1986,22 @@ // Membres de la classe d'accs aux fichiers d'initialisation (.ini) - sauvegarde // ==================================================================================== +/** + * Ajustement d'un nom de cl selon la plateforme utilise + * \param[in] pszKey Nom de la cl devant tre ajuste + * \param[in] nBufSize Taille du tampon qui la contient + **/ +void CConfigFile::PlatformAdjust(LPTSTR pszKey, UINT32 nBufSize) +{ +#ifdef _WIN64 + // Utilisation d'appellations distinctes en OS 64 bits : les deux versions peuvent + // y exister concurremment, et les pilotes ou codecs vus par chacune sont diffrents. + strcat_T(pszKey, nBufSize, TEXT(" (x64)")); +#endif + if (IsDebuggerPresent()) + strcat_T(pszKey, nBufSize, TEXT(" (debug)")); +} + CConfigFile & CConfigFile::NewTunerSection(LPCTSTR pszTunerName) { TCHAR szWrk[256] = TEXT("Tuner : "); @@ -1987,13 +2025,7 @@ TCHAR szActualName[64]; strcpy_T(szActualName, lpKeyName); -#ifdef _WIN64 - // Utilisation d'appellations distinctes en OS 64 bits : les deux versions peuvent - // y exister concurremment, et les pilotes ou codecs vus par chacune sont diffrents. - strcat_T(szActualName, TEXT(" (x64)")); -#endif - if (IsDebuggerPresent()) - strcat_T(szActualName, TEXT(" (debug)")); + PlatformAdjust(szActualName, _countof(szActualName)); return save_str(szActualName, lpString); } @@ -2274,23 +2306,20 @@ * Cherche un nom de pilote dans le fichier de configuration. * Gre le cas de la prsence d'un debugger. * - * \param[in] lpKeyName nom de l'option rechercher + * \param[in] lpKeyName nom de l'option rechercher * \param[out] lpValue valeur recherche - * \param[in] bufSize nombre de caractres dans la chane de retours + * \param[in] bufSize nombre de caractres dans la chane de retour * \return Nombre de caractres copis, sans tenir compte du caractre '\\0' **/ DWORD CConfigFile::load_driver_str(LPCTSTR lpKeyName, LPTSTR lpValue, DWORD bufSize) { TCHAR szActualName[64]; - bool bDebug = IsDebuggerPresent()!=0; - strcpy_T(szActualName, lpKeyName); #ifdef _WIN64 // Utilisation d'appellations distinctes en OS 64 bits : les deux versions peuvent // y exister concurremment, et les pilotes ou codecs vus par chacune sont diffrents. - strcat_T(szActualName, TEXT(" (x64)")); - if (bDebug) - strcat_T(szActualName, TEXT(" (debug)")); + strcpy_T(szActualName, lpKeyName); + PlatformAdjust(szActualName, _countof(szActualName)); DWORD nLen = load_str(szActualName, lpValue, bufSize); @@ -2299,9 +2328,9 @@ // En cas d'chec, il se peut que la configuration ait t faite avec une ancienne // version 64 bits. Au cas o, on ressaie avec l'ancien nom : +#endif strcpy_T(szActualName, lpKeyName); -#endif - if (bDebug) + if (IsDebuggerPresent()) strcat_T(szActualName, TEXT(" (debug)")); return load_str(szActualName, lpValue, bufSize); } @@ -2309,7 +2338,7 @@ /** * Charge la taille/position de la fentre dans le fichier de configuration * - * \param[in] lpKeyName nom de l'option rechercher + * \param[in] lpKeyName nom de l'option rechercher * \param[out] wpos structure retournant la taille trouve, ou initialise avec les valeurs par dfaut * \param[in] defL largeur par dfaut, si pas trouv * \param[in] defH hauteur par dfaut, si pas trouv @@ -2484,7 +2513,7 @@ // ==================================================================================== /** - * Charge la configuration spcifique au tuner + * Charge les donnes spcifiques au tuner configur **/ void load_config_tuner() { @@ -2638,7 +2667,6 @@ } } - /** * Reconstituer l'options "--prefix" ventuelle d'instance secondaire de l'application **/ @@ -2650,6 +2678,7 @@ _stprintf_s(szTmp, TEXT(" --prefix %s"), prefix_conf); return szTmp; } + /// Ajout d'une option "Ne plus afficher ce message" aux dialogues de messages struct MessageBoxHookData { Modifié: trunk/mpeg2defs.h =================================================================== --- trunk/mpeg2defs.h 2009-11-11 17:50:32 UTC (rev 208) +++ trunk/mpeg2defs.h 2009-12-04 10:55:31 UTC (rev 209) @@ -509,7 +509,7 @@ // mdt_Data_Broadcast_ID = 0x66, mdt_AC3_Audio = 0x6a, // DVB - mdt_Extended_AC3_Audio = 0x7a, + mdt_Enhanced_AC3_Audio = 0x7a, // mdt_AC3_Audio__2 = 0x81, // DCII ou ATSC mdt_Logical_Channel = 0x83, @@ -1312,26 +1312,12 @@ #define AC3_SUBSTREAM2_FLAG 0x02 #define AC3_SUBSTREAM3_FLAG 0x01 -struct MDescriptor_7a : public MDescriptor_6a // tag = mdt_Extended_AC3_Audio +struct MDescriptor_7a : public MDescriptor_6a // tag = mdt_Enhanced_AC3_Audio { UINT8 flags() const { return ac3_flags;} }; -/* Data broadcast id descriptor (PMT) tag 0x66 - - Syntax No. of bits Offset - ---------------------------------------------------------- - data_broadcast_id_descriptor(){ - descriptor_tag 8 0 - descriptor_length 8 1 - data_broadcast_id 16 2,3 - for(i=0;i0 && str[--len]<=' ') - str[len] = 0; - } else - str[0] = 0; -} - // ==================================================================================== // Recherche de codecs // ==================================================================================== @@ -100,22 +74,11 @@ // numration des "monikers". for (ENUM_ITF(pEnum, IMoniker, pMoniker)) { - CComPtr pPropBag; + MonikerBindings cMnkb(pMoniker, &hr); - hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag); - if (FAILED(hr)) + if (!cMnkb.isOk()) continue; - - // To retrieve the friendly name of the filter, do the following: - CComVariant varName; - - if (FAILED(hr = pPropBag->Read(L"FriendlyName", &varName, 0))) - continue; - - // Display the name in your UI somehow. - VarStr_helper vstr(varName); - - hr = ApplyOne(pMoniker, vstr()); + hr = ApplyOne(cMnkb); if (hr==S_FALSE) return S_OK; // On a trouv quelque chose if (FAILED(hr)) @@ -217,28 +180,14 @@ // numration des "monikers". for (ENUM_ITF(pEnumMoniker, IMoniker, pMoniker)) { - CComPtr pPropBag; + MonikerBindings cMnkb(pMoniker, &hr); - hr = pMoniker->BindToStorage(NULL, NULL, IID_IPropertyBag, (void **)&pPropBag); - if (FAILED(hr)) + if (!cMnkb.isOk()) continue; - - CComPtr pFilter; - - hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter); + hr = cMnkb.BindToFilter(); if (FAILED(hr)) continue; - - // To retrieve the friendly name of the filter, do the following: - CComVariant varName; - - if (FAILED(pPropBag->Read(L"FriendlyName", &varName, 0))) - continue; - - VarStr_helper vstr(varName); - - hr = ApplyOne(pFilter, vstr()); - + hr = ApplyOne(cMnkb); if (FAILED(hr) || hr==S_FALSE) break; } Modifié: trunk/search.h =================================================================== --- trunk/search.h 2009-11-11 17:50:32 UTC (rev 208) +++ trunk/search.h 2009-12-04 10:55:31 UTC (rev 209) @@ -28,6 +28,8 @@ #pragma once +#include "filters.h" + // ==================================================================================== // Recherche de codecs // ==================================================================================== @@ -35,7 +37,7 @@ /** * Classe d'assistance l'numration de codecs ayant des * caractristiques donnes. - */ + **/ class CSearchByType { CComPtr pMapper; @@ -48,23 +50,22 @@ * \param[in] type CLSID pour le type * \param[in] subtype CLSID pour le sous-type * \param[in] bExactMatch true si correspondance exacte requise - */ + **/ CSearchByType(GUID type, GUID subtype, bool bExactMatch); /** * Mthode virtuelle "pure" appele pour chaque filtre trouv. - * \param[in] pMoniker "Moniker" vers ce filtre - * \param[in] pszName nom du filtre - * \retval S_OK si l'numration doit ensuite continuer - * \retval S_FALSE si l'numration doit s'arrter (par exemple parce qu'on - * a trouv ce qu'on cherchait) - */ - virtual HRESULT ApplyOne(CComPtr & pMoniker, LPCTSTR pszName) = 0; + * \param[in] cMnkb Structure contenant les informations de recherche + * \retval S_OK si l'numration doit ensuite continuer + * \retval S_FALSE si l'numration doit s'arrter (par exemple parce qu'on + * a trouv ce qu'on cherchait) + **/ + virtual HRESULT ApplyOne(MonikerBindings & cMnkb) = 0; /** * Application de la mthode virtuelle \p ApplyOne chaque filtre trouv. * \return Code d'erreur DirectShow - */ + **/ HRESULT Do(); }; @@ -84,7 +85,7 @@ * \param[in] subtype CLSID pour le sous-type * \param[in] bExactMatch true si correspondance exacte requise * \param[in] vStrFlt tableau de chanes de caractres remplir. - */ + **/ CSearchByType_FillVector(GUID type, GUID subtype, bool bExactMatch, vector & vStrFlt) : CSearchByType(type, subtype, bExactMatch), vStrFiltres(vStrFlt) @@ -92,13 +93,12 @@ /** * Implmentation de mthode virtuelle appele pour chaque codec trouv. - * \param[in] pMoniker "Moniker" vers ce filtre - * \param[in] pszName nom du filtre - * \return \p S_OK car tous les filtres doivent tre numrs - */ - virtual HRESULT ApplyOne(CComPtr & pMoniker, LPCTSTR pszName) + * \param[in] cMnkb Structure contenant les informations de recherche + * \return \p S_OK car tous les filtres doivent tre numrs + **/ + virtual HRESULT ApplyOne(MonikerBindings & cMnkb) { - vStrFiltres.push_back(tstring(pszName)); + vStrFiltres.push_back(cMnkb.strName); return S_OK; } }; @@ -120,7 +120,7 @@ * \param[in] bExactMatch true si correspondance exacte requise * \param[in] pszSrch Nom du codec recherch. * \param[out] pFltr Pointeur ATL destin recevoir l'interface du filtre trouv, s'il existe. - */ + **/ CSearchByType_Get(GUID type, GUID subtype, bool bExactMatch, LPCTSTR pszSrch, CComPtr & pFltr) : CSearchByType(type, subtype, bExactMatch), pszSearch(pszSrch), @@ -137,16 +137,17 @@ /** * Implmentation de mthode virtuelle appele pour chaque filtre trouv. - * \param[in] pMoniker "Moniker" vers ce filtre - * \param[in] pszName nom du codec - * \retval true tant que le codec n'a pas t trouv - * \retval false quand le codec a t trouv, afin d'arrter la recherche - */ - virtual HRESULT ApplyOne(CComPtr & pMoniker, LPCTSTR pszName) + * \param[in] cMnkb Structure contenant les informations de recherche + * \retval true tant que le codec n'a pas t trouv + * \retval false quand le codec a t trouv, afin d'arrter la recherche + **/ + virtual HRESULT ApplyOne(MonikerBindings & cMnkb) { - if (_tcscmp(pszName, pszSearch)==0) { - hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter); - return S_FALSE; + if (cMnkb.strName == pszSearch) { + if (SUCCEEDED(hr = cMnkb.BindToFilter())) { + pFilter = cMnkb.pFilter; + return S_FALSE; + } } return S_OK; @@ -159,7 +160,7 @@ /** * Listes des valeurs retournes par \p filtre_compat - */ + **/ enum CompatResult { compat_None, //!< 0 pas compat @@ -173,20 +174,21 @@ * \retval compat_None Aucune compatibilit * \retval compat_Tuner Compatibilit Tuner / PCI / KSDATAFORMAT_TYPE_MPEG2_TRANSPORT * \retval compat_Receiver Compatibilit Receiver / USB / KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT - */ + **/ CompatResult filtre_compat(CComPtr & pFilter); /** * Classe d'assistance l'numration des filtres dans une catgorie donne. - */ + **/ class CSearchByCategory { CComPtr pDevEnum; CComPtr pEnumMoniker; - HRESULT hr; protected: + HRESULT hr; + /** * Ajout d'un nom de filtre une liste de noms, en s'assurant que ce nom n'existe pas dj dans * la liste. Si c'est le cas, le nom est modifi afin de devenir unique. @@ -201,23 +203,22 @@ /** * Constructeur : prpare l'numration pour une catgorie donne. * \param[in] clsid CLSID pour la catgorie - */ + **/ CSearchByCategory(CLSID clsid); /** * Mthode virtuelle "pure" appele pour chaque filtre trouv. - * \param[in] pszName nom du filtre - * \param[in] pCurFltr interface vers ce filtre - * \retval S_OK si l'numration doit ensuite continuer - * \retval S_FALSE si l'numration doit s'arrter (par exemple parce qu'on - * a trouv ce qu'on cherchait) - */ - virtual HRESULT ApplyOne(CComPtr & pCurFltr, LPCTSTR pszName) = 0; + * \param[in] cMnkb Structure contenant les informations de recherche + * \retval S_OK si l'numration doit ensuite continuer + * \retval S_FALSE si l'numration doit s'arrter (par exemple parce qu'on + * a trouv ce qu'on cherchait) + **/ + virtual HRESULT ApplyOne(MonikerBindings & cMnkb) = 0; /** * Application de la mthode virtuelle \p ApplyOne chaque filtre trouv. * \return Code d'erreur DirectShow - */ + **/ HRESULT Do(); }; @@ -234,7 +235,7 @@ * liste droulante avec une liste de filtres dans une catgorie donne. * \param[in] clsid CLSID pour la catgorie * \param[in] vStrFlt tableau de chanes de caractres remplir. - */ + **/ CSearchByCategory_FillVector(CLSID clsid, vector & vStrFlt) : CSearchByCategory(clsid), vStrFiltres(vStrFlt) @@ -242,15 +243,14 @@ /** * Implmentation de mthode virtuelle appele pour chaque filtre trouv. - * \param[in] pCurFltr interface vers ce filtre - * \param[in] pszName nom du filtre - * \return \p S_OK car tous les filtres doivent tre numrs - */ - virtual HRESULT ApplyOne(CComPtr & pCurFltr, LPCTSTR pszName) + * \param[in] cMnkb Structure contenant les informations de recherche + * \return \p S_OK car tous les filtres doivent tre numrs + **/ + virtual HRESULT ApplyOne(MonikerBindings & cMnkb) { - if (filtre_compat(pCurFltr)!=compat_None) { - myprintf(TEXT("CSearchByCategory_FillVector : %s") EOL, pszName); - AddToVector(vStrFiltres, pszName); + if (filtre_compat(cMnkb.pFilter)!=compat_None) { + myprintf(TEXT("CSearchByCategory_FillVector : %s") EOL, cMnkb.strName.c_str()); + AddToVector(vStrFiltres, cMnkb.strName.c_str()); } return S_OK; } @@ -272,7 +272,7 @@ * \param[in] clsid CLSID pour la catgorie * \param[in] pszSrch Nom du filtre recherch. * \param[out] pFltr Pointeur ATL destin recevoir l'interface du filtre trouv, s'il existe. - */ + **/ CSearchByCategory_Get(CLSID clsid, LPCTSTR pszSrch, CComPtr & pFltr) : CSearchByCategory(clsid), pszSearch(pszSrch), @@ -288,15 +288,14 @@ /** * Implmentation de mthode virtuelle appele pour chaque filtre trouv. - * \param[in] pszName nom du filtre - * \param[in] pCurFltr interface vers ce filtre + * \param[in] cMnkb Structure contenant les informations de recherche * \retval true tant que le filtre n'a pas t trouv * \retval false quand le filtre a t trouv, afin d'arrter la recherche - */ - virtual HRESULT ApplyOne(CComPtr & pCurFltr, LPCTSTR pszName) + **/ + virtual HRESULT ApplyOne(MonikerBindings & cMnkb) { - if (_tcscmp(AddToVector(vStrFiltres, pszName), pszSearch)==0) { - pFilter = pCurFltr; + if (_tcscmp(AddToVector(vStrFiltres, cMnkb.strName.c_str()), pszSearch)==0) { + pFilter = cMnkb.pFilter; return S_FALSE; } return S_OK; Modifié: trunk/utils.cpp =================================================================== --- trunk/utils.cpp 2009-11-11 17:50:32 UTC (rev 208) +++ trunk/utils.cpp 2009-12-04 10:55:31 UTC (rev 209) @@ -72,6 +72,34 @@ } /** + * Copie vers chane STL, version CHAR -> std::wstring. + * + * \param[in] pSrc Pointeur sur la chane source (CHAR) + * \param[in] strDst Chane STL de destination (std::wstring) + **/ +errno_t strcpy_T(std::wstring & strDst, LPCSTR pSrc) +{ + COPY_STR_ON_STACK(WCHAR, pszTmp, pSrc, nLen); + + strDst = pszTmp; + return 0; +} + +/** + * Copie vers chane STL, version WCHAR -> std::string. + * + * \param[in] pSrc Pointeur sur la chane source (WCHAR) + * \param[in] strDst Chane STL de destination (std::string) + **/ +errno_t strcpy_T(std::string & strDst, LPCWSTR pSrc) +{ + COPY_STR_ON_STACK(CHAR, pszTmp, pSrc, nLen); + + strDst = pszTmp; + return 0; +} + +/** * Version CHAR -> WCHAR (utilise \p MultiByteToWideChar). * * \param[in] pSrc Pointeur sur la chane source (CHAR) Modifié: trunk/utils.h =================================================================== --- trunk/utils.h 2009-11-11 17:50:32 UTC (rev 208) +++ trunk/utils.h 2009-12-04 10:55:31 UTC (rev 209) @@ -177,6 +177,19 @@ // ---------------------------------------------------------------------------- +#ifdef _UNICODE + typedef std::wstring tstring; //!< Alias "TCHAR" pour \p string ou \p wstring +#else + typedef std::string tstring; //!< Alias "TCHAR" pour \p string ou \p wstring +#endif + +/** + * Gnration d'une chane formate (format \p printf) avec rsultat dans une chane \p tstring + **/ +tstring tstr_printf(LPCTSTR pszFmt, ...); + +// ---------------------------------------------------------------------------- + /** @defgroup strcpy_T Copies de chanes entre \p CHAR / \p WCHAR / \p TCHAR * Ces fonctions assurent la copie depuis des chanes de caractres de type \p TCHAR * depuis ou vers des chanes de caractres \p CHAR ou \p WCHAR. @@ -243,6 +256,46 @@ inline errno_t strcpy_T(TD (&szDst)[S], const TS * pSrc) { return strcpy_T(szDst, S, pSrc); } +/** + * Copie vers chane STL, version CHAR -> std::wstring. + * + * \param[in] pSrc Pointeur sur la chane source (CHAR) + * \param[in] strDst Chane STL de destination (std::wstring) + **/ +errno_t strcpy_T(std::wstring & strDst, LPCSTR pSrc); + +/** + * Copie vers chane STL, version WCHAR -> std::string. + * + * \param[in] pSrc Pointeur sur la chane source (WCHAR) + * \param[in] strDst Chane STL de destination (std::string) + **/ +errno_t strcpy_T(std::string & strDst, LPCWSTR pSrc); + +/** + * Copie vers chane STL, version CHAR -> std::string. + * + * \param[in] pSrc Pointeur sur la chane source (CHAR) + * \param[in] strDst Chane STL de destination (std::string) + **/ +inline errno_t strcpy_T(std::string & strDst, LPCSTR pSrc) +{ + strDst = pSrc; + return 0; +} + +/** + * Copie vers chane STL, version WCHAR -> std::wstring. + * + * \param[in] pSrc Pointeur sur la chane source (WCHAR) + * \param[in] strDst Chane STL de destination (std::wstring) + **/ +inline errno_t strcpy_T(std::wstring & strDst, LPCWSTR pSrc) +{ + strDst = pSrc; + return 0; +} + /** @} */ // fin de strcpy_T // ---------------------------------------------------------------------------- @@ -428,18 +481,7 @@ // ---------------------------------------------------------------------------- -#ifdef _UNICODE - typedef std::wstring tstring; //!< Alias "TCHAR" pour \p string ou \p wstring -#else - typedef std::string tstring; //!< Alias "TCHAR" pour \p string ou \p wstring -#endif - /** - * Gnration d'une chane formate (format \p printf) avec rsultat dans une chane \p tstring - **/ -tstring tstr_printf(LPCTSTR pszFmt, ...); - -/** * Macro d'assistance l'encapsulation de fonctionnalits "printf" * * Aprs excution du code correspondant, la chane formate est disponible From pouchintv-dev at baysse.fr Fri Dec 4 15:10:35 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Fri, 04 Dec 2009 14:10:35 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r210 - trunk Message-ID: <20091204141023.BE92A5F75A@mail.baysse.fr> Author: gingko Date: 2009-12-04 15:10:22 +0100 (ven 04 déc 2009) New Revision: 210 Modified: trunk/channels.cpp trunk/filters.cpp trunk/filters.h trunk/graph.cpp trunk/graph.h trunk/parse.cpp Log: Accroissement de la modularité du graphe graph.h, graph.cpp : * Les classes de construction du graphe sont réorganisées de manière à comporter un niveau d'abstraction (intermédiaire) supplémentaire, afin de permettre la création de graphes partiels (dont l'utilité ressortira très très bientôt). * Ajout d'une fonction membre de debugging "CPTvM_TunerGraph::View_IBDA_Topology" qui traînait dans mon code depuis un moment, et dont j'ai finalement décidé de faire profiter toute la communauté. filters.h, filters.cpp, graph.h, graph.cpp : * Dans quelques fonctions ou méthodes, les paramètres de type "CComPtr<>" redeviennent des pointeurs simples (l'utilisation de ces classes ATL n'étant pas nécessaire aussi longtemps que le pointeur n'est pas "possédé" par un objet quelconque). De plus, ceci se révélait gênant dans certaines situations où on ne dispose que d'un pointeur simple à passer en paramètre. graph.h, graph.cpp, channels.cpp, parse.cpp : * La méthode "change_frequence" reçoit deux paramètres supplémentaires (dont un ne montrera son utilité qu'à la prochaine livraison de code). Modifié: trunk/channels.cpp =================================================================== --- trunk/channels.cpp 2009-12-04 10:55:31 UTC (rev 209) +++ trunk/channels.cpp 2009-12-04 14:10:22 UTC (rev 210) @@ -571,7 +571,7 @@ #if USE_CONSOLE tstring strErr; #endif - pGraph->change_frequence(nouveau_canal.khz IF_CONSOLE_CB(&strErr)); + pGraph->change_frequence(nouveau_canal.khz, DVBT_BANDWIDTH, &nouveau_canal IF_CONSOLE_CB(&strErr)); myprintf(CMyP ERRX(TEXT("Erreur(s) change_frequence : %s")), !strErr.empty(), strErr.c_str()); } Modifié: trunk/filters.cpp =================================================================== --- trunk/filters.cpp 2009-12-04 10:55:31 UTC (rev 209) +++ trunk/filters.cpp 2009-12-04 14:10:22 UTC (rev 210) @@ -315,7 +315,7 @@ * est diffrente de NOTCONNECTED, elle doit en plus accepter le mdia spcifi/ * \retval \p S_OK en cas de succs **/ -HRESULT cherche_pin(CComPtr & pFilter, PIN_DIRECTION dir, +HRESULT cherche_pin(IBaseFilter * pFilter, PIN_DIRECTION dir, CComPtr & result, const AM_MEDIA_TYPE * pmt) { // myprintf(TEXT("** cherche_pin") EOL); Modifié: trunk/filters.h =================================================================== --- trunk/filters.h 2009-12-04 10:55:31 UTC (rev 209) +++ trunk/filters.h 2009-12-04 14:10:22 UTC (rev 210) @@ -259,6 +259,6 @@ * est diffrente de NOTCONNECTED, elle doit en plus accepter le mdia spcifi/ * \retval \p S_OK en cas de succs **/ -HRESULT cherche_pin(CComPtr & pFilter, PIN_DIRECTION dir, +HRESULT cherche_pin(IBaseFilter * pFilter, PIN_DIRECTION dir, CComPtr & result, const AM_MEDIA_TYPE * pmt=NULL); Modifié: trunk/graph.cpp =================================================================== --- trunk/graph.cpp 2009-12-04 10:55:31 UTC (rev 209) +++ trunk/graph.cpp 2009-12-04 14:10:22 UTC (rev 210) @@ -250,7 +250,7 @@ /// Pointeur d'accs global au graphe // ==================================================================================== -IPTvM_TunerGraph * pGraph = NULL; +IPTvM_FullGraph * pGraph = NULL; // ==================================================================================== // Exportation du graphe @@ -384,7 +384,7 @@ // de plus correspondre au type 'type' et au sous-type 'subtype' dfinis. HRESULT get_and_add_codec(DecoderData & sDData); - HRESULT connect_pin_to_filter(CComPtr & pOutPin, CComPtr & pFilter); + HRESULT connect_pin_to_filter(CComPtr & pOutPin, IBaseFilter * pFilter); /** * Connexion de la premire broche de sortie d'un filtre la premire broche @@ -393,7 +393,7 @@ * \param[in] dest Filtre prsentant la broche d'entre connecter * \return Code d'erreur DirectShow **/ - virtual HRESULT connect_filters(CComPtr & source, CComPtr & dest); + virtual HRESULT connect_filters(IBaseFilter * source, IBaseFilter * dest); /** * Dconnexion de la broche d'entre d'un filtre de la broche de sortie du filtre qui le prcde. @@ -551,7 +551,7 @@ return hr; } -HRESULT CPTvM_GraphBase::connect_pin_to_filter(CComPtr & pOutPin, CComPtr & pFilter) +HRESULT CPTvM_GraphBase::connect_pin_to_filter(CComPtr & pOutPin, IBaseFilter * pFilter) { CComPtr pInPin; HRESULT hr = cherche_pin(pFilter, PINDIR_INPUT, pInPin, NOTCONNECTED); @@ -569,7 +569,7 @@ * \param[in] dest Filtre prsentant la broche d'entre connecter * \return Code d'erreur DirectShow **/ -HRESULT CPTvM_GraphBase::connect_filters(CComPtr & source, CComPtr & dest) +HRESULT CPTvM_GraphBase::connect_filters(IBaseFilter * source, IBaseFilter * dest) { CComPtr pOutPin; HRESULT hr = cherche_pin(source, PINDIR_OUTPUT, pOutPin); @@ -680,10 +680,10 @@ } // ==================================================================================== -/// Graphe Tuner gnrique +/// Graphe Tuner // ==================================================================================== -class CPTvM_TunerGraph : public IPTvM_TunerGraph, public CPTvM_GraphBase +class CPTvM_TunerGraph : public virtual IPTvM_TunerGraph, public CPTvM_GraphBase { friend class SignalStatistics; @@ -696,11 +696,17 @@ **/ static HRESULT Search_IBDA_Topology(const CComPtr & pTuner, REFIID iid, CComPtr & pUnk); +#ifdef _DEBUG + static HRESULT View_IBDA_Topology(const CComPtr & pTuner); +#endif + +protected: + /** * Recherche d'une interface spcifique du filtre tuner, via son interface gnrique \p IBDA_Topology. * \param[in] pTuner Tuner dans lequel rechercher l'interface - * \param[in] pItf Pointeur du l'interface trouve (le type du pointeur dtermine le type d'interface) - * \return Code d'erreur DirectShow + * \param[in] pItf Pointeur de l'interface trouve (le type du pointeur dtermine le type d'interface) + * \return Code d'erreur DirectShow **/ template static HRESULT Search_IBDA_Topology(const CComPtr & pTuner, CComPtr & pItf) @@ -714,9 +720,59 @@ return !pItf ? E_NOINTERFACE : hr; } -protected: + /// Mmorisation du dernier filtre ajout en bout de graphe + /// (mmorisation simple : ne ncessite pas de faire un "AddRef"). + IBaseFilter * pTailFilter; + + CComPtr pNetworkTuner; + CComPtr pStats; + CComPtr pBDAControl; + CComPtr pBDAFreq; + + CPTvM_TunerGraph() : + pTailFilter(NULL) + { + } + + virtual HRESULT AddProvider() = 0; + + /** + * Ajout d'un filtre la fin du tronc principal du graphe. + * \param[in] pFilter Filtre ajouter + * \param[in] pszName Nom qui lui sera attribu + * \return Code d'erreur DirectShow + **/ + virtual HRESULT PushFilter(IBaseFilter * pFilter, LPCTSTR pszName); + + /// Rcupration des interfaces du filtre tuner + virtual HRESULT QueryTunerInterfaces(); + + HRESULT AddTunerAndReceiver(); + + /// Construction du graphe + HRESULT Build(); + + /** + * Syntonisation d'une frquence dans le tuner. + * \param[in] nFreq Frquence syntoniser, exprime en kilohertz + * \param[in] nBandwidth Largeur de bande, exprime en megahertz + * \param[in] pChIDs Autres informations optionnelles concernant la chane + * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL + **/ + virtual HRESULT change_frequence(LONG nFreq, LONG nBandwidth, const ChaineIDs * pChIDs=NULL, tstring * pstrErr=NULL); + + virtual ~CPTvM_TunerGraph() {} +}; + +// ==================================================================================== +/// Graphe TV complet +// ==================================================================================== + +class CPTvM_FullGraph : public IPTvM_FullGraph, public virtual CPTvM_TunerGraph +{ +protected: GrabberData sGrabber; FilterData sDemux; @@ -730,27 +786,19 @@ FilterData sDSoundAc3; FilterData sDSoundEac3; - #if USE_PMTFILTER + #if USE_PMTFILTER DecoderData sPMT_Filter; - #endif + #endif DecoderData sPSI_Filter; - #if USE_STD_NETWP_TUNSPC == 0 - CComPtr pBDAControl; - CComPtr pBDAFreq; - #endif - - VideoStreamType ePrevVideoType; //!< Type de flux vido couramment utilis (pour pouvoir + VideoStreamType eCurrVideoType; //!< Type de flux vido couramment utilis (pour pouvoir //!< dtecter quand changer de codec) bool bSuspended; //!< \p true si sorties mdias suspendues - virtual HRESULT AddProvider(CComPtr & pLastAddedFilter) = 0; + HRESULT AddGrabber(); + HRESULT AddDemux(); - HRESULT AddTunerAndReceiver(CComPtr & pLastAddedFilter); - HRESULT AddGrabber(CComPtr & pLastAddedFilter); - HRESULT AddDemux(CComPtr & pLastAddedFilter); - /** * Crer ou obtenir une broche de sortie sur ou depuis le dmultiplexeur. * @@ -781,13 +829,6 @@ virtual HRESULT HandleGraphEvent(HWND hWnd); /** - * Syntonisation d'une frquence dans le tuner. - * \param[in] freq Frquence syntoniser, exprime en kilohertz - * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL - **/ - virtual HRESULT change_frequence(ULONG freq, tstring * pstrErr); - - /** * Changement de volume sonore * \param[in] volume Nouveau volume sonore, valeur de 0 100 * \return Code d'erreur DirectShow @@ -863,18 +904,18 @@ public: /// Constructeur - CPTvM_TunerGraph(); + CPTvM_FullGraph(VideoStreamType eInitialVideoType); /// Construction du graphe HRESULT Build(); /// Destructeur - virtual ~CPTvM_TunerGraph() { + virtual ~CPTvM_FullGraph() { } }; /// Constructeur -CPTvM_TunerGraph::CPTvM_TunerGraph() : +CPTvM_FullGraph::CPTvM_FullGraph(VideoStreamType eInitialVideoType) : sDemux(TEXT("MPEG2 Demultiplexer"), CLSID_MPEG2Demultiplexer), sMp2vCodec(&sMp2v_am, "vido MPEG2", filtreMPEG2, L"mp2v"), sH264Codec(&sH264_am, "vido H264", filtreH264, L"h264"), @@ -888,7 +929,7 @@ sPMT_Filter(&sPmt__am, "PMT", TEXT(PMT_FILTER_NAME), L"pmt", MEDIA_MPEG2_PSI, CPMTFilter::CreateInstance), #endif sPSI_Filter(&sPsi__am, "PSI", TEXT("MPEG-2 Sections and Tables"), L"data", MEDIA_MPEG2_PSI, _uuidof(Mpeg2Data)), - ePrevVideoType(vst_Unknown), + eCurrVideoType(eInitialVideoType), bSuspended(true) { } @@ -897,17 +938,20 @@ /// Graphe Tuner, version hrite de Pouchin TV // ==================================================================================== -class CLegacyTunerGraph : public CPTvM_TunerGraph +class CLegacyTunerGraph : public virtual CPTvM_TunerGraph { FilterData sNetworkProvider; - virtual HRESULT AddProvider(CComPtr & pLastAddedFilter) - { - HRESULT hr = create_and_add_filter(sNetworkProvider); + virtual HRESULT AddProvider(); - pLastAddedFilter = sNetworkProvider.pFilter; - return hr; - } + /** + * Identification du type de graphe. + * \retval false Normal + * \retval true Alternatif + **/ + virtual bool isLegacyGraph() const { + return true; } + public: /// Constructeur CLegacyTunerGraph() : @@ -918,26 +962,104 @@ virtual ~CLegacyTunerGraph() {} }; +HRESULT CLegacyTunerGraph::AddProvider() +{ + HRESULT hr = create_and_add_filter(sNetworkProvider); + + pTailFilter = sNetworkProvider.pFilter; + return hr; +} + +/// Ajout informations si \p pstr non \p NULL +static void addStr(tstring * pstr, LPCTSTR pszFmt, ...) +{ + if (!pstr) + return; + + if (!pstr->empty()) + *pstr += TEXT("; "); + FMT_BUF(szBuf, 96, pszFmt, pszFmt); + *pstr += szBuf; +} + +/** + * Syntonisation d'une frquence dans le tuner. + * \param[in] nFreq Frquence syntoniser, exprime en kilohertz + * \param[in] nBandwidth Largeur de bande, exprime en megahertz + * \param[in] pChIDs Autres informations optionnelles concernant la chane + * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL + **/ +HRESULT CPTvM_TunerGraph::change_frequence(LONG nFreq, LONG nBandwidth, const ChaineIDs * pChIDs, tstring * pstrErr) +{ + if (!pBDAControl || !pBDAFreq) + return E_FAIL; + + HRESULT hr = pBDAControl->StartChanges(); + + if (hr != S_OK) { + addStr(pstrErr, TEXT("StartChanges: hr=0x%08x"), hr); + return hr; + } + + hr = pBDAFreq->put_Bandwidth(nBandwidth); + if (hr != S_OK) + addStr(pstrErr, TEXT("put_Bandwidth(%ul): hr=0x%08x"), nBandwidth, hr); + + nFreq += offset_tuner; // Correction de frquence + + HRESULT hr2 = pBDAFreq->put_Frequency(nFreq); + + if (hr2 != S_OK) { + addStr(pstrErr, TEXT("put_Frequency(%ul): hr=0x%08x"), nFreq, hr2); + if (hr == S_OK) + hr = hr2; + } + + hr2 = pBDAControl->CheckChanges(); + if (hr2 != S_OK) { + addStr(pstrErr, TEXT("CheckChanges(): hr=0x%08x"), hr2); + if (hr == S_OK) + hr = hr2; + } + + hr2 = pBDAControl->CommitChanges(); + if (hr2 != S_OK) { + addStr(pstrErr, TEXT("CommitChanges(): hr=0x%08x"), hr2); + if (hr == S_OK) + hr = hr2; + } + return hr; +} + +class CLegacyFullGraph : public CLegacyTunerGraph, public CPTvM_FullGraph +{ +public: + /// Constructeur + CLegacyFullGraph(VideoStreamType eInitialVideoType) : + CPTvM_FullGraph(eInitialVideoType) + {} + + /// Destructeur + virtual ~CLegacyFullGraph() {} +}; + // ==================================================================================== /// Graphe Tuner, version "Microsoft DVB-T Network Provider" // ==================================================================================== -class CMicrosoftTunerGraph : public CPTvM_TunerGraph +class CMicrosoftTunerGraph : public virtual CPTvM_TunerGraph { - FilterData sNetworkProvider; + FilterData sNetworkProvider; - virtual HRESULT AddProvider(CComPtr & pLastAddedFilter); - virtual HRESULT AddDataFilters(IMpeg2Demultiplexer & iMp2Demux); + virtual HRESULT AddProvider(); -#if USE_STD_NETWP_TUNSPC /** - * Syntonisation d'une frquence dans le tuner. - * \param[in] freq Frquence syntoniser, exprime en kilohertz - * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL + * Identification du type de graphe. + * \retval false Normal + * \retval true Alternatif **/ - virtual HRESULT change_frequence(ULONG freq, tstring * pstrErr); -#endif - + virtual bool isLegacyGraph() const { + return false; } public: /// Constructeur CMicrosoftTunerGraph() : @@ -948,19 +1070,30 @@ virtual ~CMicrosoftTunerGraph() {} }; -HRESULT CMicrosoftTunerGraph::AddProvider(CComPtr & pLastAddedFilter) +HRESULT CMicrosoftTunerGraph::AddProvider() { HRESULT hr = create_and_add_filter(sNetworkProvider); -#if USE_STD_NETWP_TUNSPC - if (SUCCEEDED(hr)) - hr = InitNetworkProvider(*sNetworkProvider.pFilter); -#endif - pLastAddedFilter = sNetworkProvider.pFilter; + + pTailFilter = sNetworkProvider.pFilter; + return hr; } -HRESULT CMicrosoftTunerGraph::AddDataFilters(IMpeg2Demultiplexer & iMp2Demux) +class CMicrosoftFullGraph : public CMicrosoftTunerGraph, public CPTvM_FullGraph { + virtual HRESULT AddDataFilters(IMpeg2Demultiplexer & iMp2Demux); +public: + /// Constructeur + CMicrosoftFullGraph(VideoStreamType eInitialVideoType) : + CPTvM_FullGraph(eInitialVideoType) + {} + + /// Destructeur + virtual ~CMicrosoftFullGraph() {} +}; + +HRESULT CMicrosoftFullGraph::AddDataFilters(IMpeg2Demultiplexer & iMp2Demux) +{ // ####### TIF : HRESULT hr; DecoderData sTIF_Filter(&sTif__am, "TIF", TEXT("BDA MPEG2 Transport Information Filter"), L"tif", MEDIA_MPEG2_PSI, CLSID_BDA_MPEG2_TIF); @@ -968,23 +1101,13 @@ if (FAILED(hr = render_data(iMp2Demux, sTIF_Filter, true))) return hr; +//#if USE_CONSOLE +// liste_pins(sDemux); +//#endif // Contrles communs : return __super::AddDataFilters(iMp2Demux); } -#if USE_STD_NETWP_TUNSPC -/** - * Syntonisation d'une frquence dans le tuner. - * \param[in] freq Frquence syntoniser, exprime en kilohertz - * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL - **/ -HRESULT CMicrosoftTunerGraph::change_frequence(ULONG freq, tstring * pstrErr) -{ - tune(sNetworkProvider); - return __super::change_frequence(freq, pstrErr); -} -#endif // USE_STD_NETWP_TUNSPC - // ==================================================================================== /// Destruction du graphe // ==================================================================================== @@ -1005,7 +1128,7 @@ myprintf(TEXT("Destruction du graphe") EOL); // viter les accs au graphe pendant la destruction - IPTvM_TunerGraph * pTmpGraph = pGraph; + IPTvM_FullGraph * pTmpGraph = pGraph; pGraph = NULL; delete pTmpGraph; // #### Destruction effective @@ -1060,11 +1183,50 @@ return hr; } +#ifdef _DEBUG + +HRESULT CPTvM_TunerGraph::View_IBDA_Topology(const CComPtr & pTuner) +{ + CComQIPtr pTop(pTuner); + + if (!pTop) + return erreur(TEXT("L'interface IBDA_Topology n'a pas t trouve"), E_NOINTERFACE); + + ULONG NodeTypes; + ULONG NodeType[32]; + + HRESULT hr = pTop->GetNodeTypes(&NodeTypes, _countof(NodeType), NodeType); + + if (FAILED(hr)) + return hr; + + myprintf(COLR(LYELLOW, TEXT("NodeTypes count = %u")) EOL, NodeTypes); + for (ULONG i = 0; i < NodeTypes; i++) { + myprintf(COLR(LYELLOW, TEXT("-- NodeTypes[%u] = %u")) EOL, i, NodeType[i]); + ULONG nInterfaces; + GUID aInterface[32]; + + hr = pTop->GetNodeInterfaces(NodeType[i], &nInterfaces, _countof(aInterface), aInterface); + + if (FAILED(hr)) + continue; + + myprintf(COLR(LYELLOW, TEXT(" Interfaces count = %u")) EOL, nInterfaces); + for (ULONG j = 0; j < nInterfaces; j++) { + myprintf(COLR(LYELLOW, TEXT(" -- Interface = ") GUIDFMT) EOL, + GUIDPARM(aInterface[j])); + } + } + + return hr; +} +#endif + /** * Recherche d'une interface spcifique du filtre tuner, via son interface gnrique \p IBDA_Topology. * \param[in] pTuner Tuner dans lequel rechercher l'interface - * \param[in] pItf Pointeur du l'interface trouve (le type du pointeur dtermine le type d'interface) - * \return Code d'erreur DirectShow + * \param[in] pItf Pointeur de l'interface trouve (le type du pointeur dtermine le type d'interface) + * \return Code d'erreur DirectShow **/ template static HRESULT Search_IBDA_Topology(const CComPtr & pTuner, CComPtr & pItf) @@ -1091,7 +1253,7 @@ * peut satisfaire la demande * \param[out] pOutPin Interface sur la broche trouve ou cr **/ -HRESULT CPTvM_TunerGraph::get_output_pin(IMpeg2Demultiplexer & iMp2Demux, +HRESULT CPTvM_FullGraph::get_output_pin(IMpeg2Demultiplexer & iMp2Demux, DecoderData & sDData, bool bFindExisting, CComPtr & pOutPin) @@ -1118,7 +1280,7 @@ return hr; } -HRESULT CPTvM_TunerGraph::render_video(IMpeg2Demultiplexer & iMp2Demux, DecoderData & sDData) +HRESULT CPTvM_FullGraph::render_video(IMpeg2Demultiplexer & iMp2Demux, DecoderData & sDData) { if (sDData.pszName[0] == 0) { affiche_erreurs(tstr_printf(TEXT("Aucun codec %") A2t TEXT(" n'a t slectionn"), sDData.pszType).c_str()); @@ -1156,7 +1318,7 @@ return hr; } -HRESULT CPTvM_TunerGraph::render_audio(IMpeg2Demultiplexer & iMp2Demux, +HRESULT CPTvM_FullGraph::render_audio(IMpeg2Demultiplexer & iMp2Demux, DecoderData & sDData, FilterData & sSoundFilter) { if (sDData.isNull()) @@ -1200,7 +1362,7 @@ return hr; } -HRESULT CPTvM_TunerGraph::render_data(IMpeg2Demultiplexer & iMp2Demux, DecoderData & sDData, bool bFindExisting) +HRESULT CPTvM_FullGraph::render_data(IMpeg2Demultiplexer & iMp2Demux, DecoderData & sDData, bool bFindExisting) { CComPtr pOutPin; HRESULT hr = get_output_pin(iMp2Demux, sDData, bFindExisting, pOutPin); @@ -1219,7 +1381,7 @@ return hr; } -HRESULT CPTvM_TunerGraph::AddDataFilters(IMpeg2Demultiplexer & iMp2Demux) +HRESULT CPTvM_FullGraph::AddDataFilters(IMpeg2Demultiplexer & iMp2Demux) { HRESULT hr; @@ -1242,7 +1404,7 @@ return hr; } -HRESULT CPTvM_TunerGraph::AddDecoders(IMpeg2Demultiplexer & iMp2Demux) +HRESULT CPTvM_FullGraph::AddDecoders(IMpeg2Demultiplexer & iMp2Demux) { HRESULT hr; @@ -1374,7 +1536,7 @@ * \param[in] hWnd Handle de la fentre principale * \return Code d'erreur DirectShow **/ -HRESULT CPTvM_TunerGraph::HandleGraphEvent(HWND hWnd) +HRESULT CPTvM_FullGraph::HandleGraphEvent(HWND hWnd) { // Disregard if we don't have an IMediaEventEx pointer. if (!pEvents) @@ -1527,21 +1689,38 @@ // Construction du graphe // ==================================================================================== -HRESULT CPTvM_TunerGraph::AddTunerAndReceiver(CComPtr & pLastAddedFilter) +/** + * Ajout d'un filtre la fin du tronc principal du graphe. + * \param[in] pFilter Filtre ajouter + * \param[in] pszName Nom qui lui sera attribu + * \return Code d'erreur DirectShow + **/ +HRESULT CPTvM_TunerGraph::PushFilter(IBaseFilter * pFilter, LPCTSTR pszName) { - CComPtr pNetworkTuner; - HRESULT hr = E_FAIL; + HRESULT hr = AddFilterToGraph(pFilter, pszName); + if (FAILED(hr)) + return hr; + + hr = connect_filters(pTailFilter, pFilter); + if (SUCCEEDED(hr)) + pTailFilter = pFilter; + else + pFGrph->RemoveFilter(pFilter); + + return hr; +} + +HRESULT CPTvM_TunerGraph::AddTunerAndReceiver() +{ + HRESULT hr = E_FAIL; + CSearchByCategory_Get(KSCATEGORY_BDA_NETWORK_TUNER, nom_tuner, pNetworkTuner).Do(); - hr = AddFilterToGraph(pNetworkTuner, nom_tuner); - if (FAILED(hr)) - return erreur(TEXT("chec de l'insertion du filtre Tuner"), hr); - // connect Tuner - hr = connect_filters(pLastAddedFilter, pNetworkTuner); + hr = PushFilter(pNetworkTuner, nom_tuner); if (FAILED(hr)) - return erreur(TEXT("Tuner TNT non compatible, veuillez effacer \"config.ini\" et redmarrer"), hr); + return erreur(TEXT("Tuner TNT non compatible, veuillez revoir la configuration et redmarrer"), hr); CompatResult eCompat = filtre_compat(pNetworkTuner); @@ -1550,46 +1729,58 @@ CSearchByCategory_Get(KSCATEGORY_BDA_RECEIVER_COMPONENT, nom_receiver, pReceiverComponent).Do(); - hr = AddFilterToGraph(pReceiverComponent, nom_receiver); - if (FAILED(hr)) - return erreur(TEXT("chec de l'insertion du filtre Rcepteur"), hr); - // connect Receiver - hr = connect_filters(pNetworkTuner, pReceiverComponent); + hr = PushFilter(pReceiverComponent, nom_receiver); if (FAILED(hr)) - return erreur(TEXT("Rcepteur TNT non compatible, veuillez effacer \"config.ini\" et redmarrer"), hr); + return erreur(TEXT("Rcepteur TNT non compatible, veuillez revoir la configuration et redmarrer"), hr); + } - pLastAddedFilter = pReceiverComponent; // Mmoriser pour connexion suivante - } else if (eCompat == compat_Receiver) - pLastAddedFilter = pNetworkTuner; // Mmoriser pour connexion suivante + return QueryTunerInterfaces(); +} +/// Rcupration des interfaces du filtre tuner +HRESULT CPTvM_TunerGraph::QueryTunerInterfaces() +{ + HRESULT hr; + + #ifdef _DEBUG + View_IBDA_Topology(pNetworkTuner); + #endif + hr = pNetworkTuner.QueryInterface(&pBDAControl); - if (FAILED(hr)) return erreur(TEXT("L'interface IBDA_DeviceControl n'a pas t trouve"), hr); - hr = Search_IBDA_Topology(pNetworkTuner, pBDAFreq); if (FAILED(hr)) return erreur(TEXT("L'interface de changement de frquence n'a pas t trouve"), hr); - hr = Search_IBDA_Topology(pNetworkTuner, pStats); if (FAILED(hr)) return erreur(TEXT("L'interface de qualit du signal n'a pas t trouve"), hr); + return hr; } -HRESULT CPTvM_TunerGraph::AddGrabber(CComPtr & pLastAddedFilter) +/// Construction du graphe +HRESULT CPTvM_TunerGraph::Build() { - HRESULT hr; + // Construction du graphe de base : + HRESULT hr = __super::Build(); - FilterData sGrabberFilter(TEXT("Grabber"), CLSID_SampleGrabber); - - hr = create_and_add_filter(sGrabberFilter); if (FAILED(hr)) return hr; + hr = AddProvider(); // Network provider + return hr; +} - hr = connect_filters(pLastAddedFilter, sGrabberFilter.pFilter); +HRESULT CPTvM_FullGraph::AddGrabber() +{ + FilterData sGrabberFilter(TEXT("Grabber"), CLSID_SampleGrabber); + HRESULT hr = sGrabberFilter.Create(); + if (FAILED(hr)) + return erreur(TEXT("Le filtre \"%s\" n'a pas pu tre cr"), hr, sGrabberFilter.pszName); + hr = PushFilter(sGrabberFilter.pFilter, sGrabberFilter.pszName); + if (FAILED(hr)) return erreur( TEXT("Le grabber n'a pas pu tre connect la carte TNT, ") TEXT("veuillez effacer \"%s%s\" et redmarrer"), hr, prefix_conf, config_file); @@ -1601,18 +1792,16 @@ sGrabber.pCallback = new CSampleGrabber(); if (sGrabber.pCallback==NULL) return erreur(TEXT("L'interface de callback du grabber n'a pas pu tre cre"), E_FAIL); - pLastAddedFilter = sGrabberFilter.pFilter; // Mmoriser pour connexion suivante return hr; } -HRESULT CPTvM_TunerGraph::AddDemux(CComPtr & pLastAddedFilter) +HRESULT CPTvM_FullGraph::AddDemux() { - HRESULT hr = create_and_add_filter(sDemux); + HRESULT hr = sDemux.Create(); if (FAILED(hr)) return hr; - - hr = connect_filters(pLastAddedFilter, sDemux.pFilter); + hr = PushFilter(sDemux.pFilter, sDemux.pszName); if (FAILED(hr)) return erreur( TEXT("Le grabber n'a pas pu tre connect au dmultiplexeur, ") @@ -1621,7 +1810,7 @@ } /// Construction du graphe -HRESULT CPTvM_TunerGraph::Build() +HRESULT CPTvM_FullGraph::Build() { // Construction du graphe de base : HRESULT hr = __super::Build(); @@ -1629,17 +1818,12 @@ if (FAILED(hr)) return hr; - CComPtr pLastAddedFilter; //!< Pointeur sur dernier filtre ajout - - // Ajout des lments ncessaires au tuner : - if (FAILED(hr = AddProvider(pLastAddedFilter))) // Network provider + if (FAILED(hr = AddTunerAndReceiver())) // Tuner et rcepteur return hr; - if (FAILED(hr = AddTunerAndReceiver(pLastAddedFilter))) // Tuner et rcepteur + if (FAILED(hr = AddGrabber())) // Grabber return hr; - if (FAILED(hr = AddGrabber(pLastAddedFilter))) // Grabber + if (FAILED(hr = AddDemux())) // Dmultiplexeur return hr; - if (FAILED(hr = AddDemux(pLastAddedFilter))) // Dmultiplexeur - return hr; // Interface du dmultiplexeur CComQIPtr pMpeg2Demux(sDemux.pFilter); @@ -1655,6 +1839,15 @@ return hr; } +/// Construction du graphe complet, selon le type de graphe requis +IPTvM_FullGraph * new_FullGraph(bool bLegacy, VideoStreamType eVideoType) +{ + if (bLegacy) + return new CLegacyFullGraph(eVideoType); + else + return new CMicrosoftFullGraph(eVideoType); +} + /** * Construction et mise en route du graphe DirectShow * \param[in] eVideoType Type de flux vido initial (prsum si inconnu) @@ -1669,11 +1862,7 @@ DbgInitialise(hAppInstance); #endif - if (autre_graphe) - pGraph = new CLegacyTunerGraph(); - else - pGraph = new CMicrosoftTunerGraph(); - + pGraph = new_FullGraph(autre_graphe, vst_Unknown); if (!pGraph) return E_FAIL; @@ -1711,74 +1900,12 @@ // Contrle de la rception // ==================================================================================== -/// Ajout informations si \p pstr non \p NULL -static void addStr(tstring * pstr, LPCTSTR pszFmt, ...) -{ - if (!pstr) - return; - - if (!pstr->empty()) - *pstr += TEXT("; "); - FMT_BUF(szBuf, 96, pszFmt, pszFmt); - *pstr += szBuf; -} - /** - * Syntonisation d'une frquence dans le tuner. - * \param[in] freq Frquence syntoniser, exprime en kilohertz - * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL - **/ -HRESULT CPTvM_TunerGraph::change_frequence(ULONG freq, tstring * pstrErr) -{ -#if USE_STD_NETWP_TUNSPC == 0 - - if (!pBDAControl || !pBDAFreq) - return E_FAIL; - - HRESULT hr = pBDAControl->StartChanges(); - - if (hr != S_OK) { - addStr(pstrErr, TEXT("StartChanges: hr=0x%08x"), hr); - return hr; - } - - hr = pBDAFreq->put_Bandwidth(8); - if (hr != S_OK) - addStr(pstrErr, TEXT("put_Bandwidth(8): hr=0x%08x"), hr); - - freq += offset_tuner; // Correction de frquence - - HRESULT hr2 = pBDAFreq->put_Frequency(freq); - - if (hr2 != S_OK) { - addStr(pstrErr, TEXT("put_Frequency(%ul): hr=0x%08x"), freq, hr2); - if (hr == S_OK) - hr = hr2; - } - - hr2 = pBDAControl->CheckChanges(); - if (hr2 != S_OK) { - addStr(pstrErr, TEXT("CheckChanges(): hr=0x%08x"), hr2); - if (hr == S_OK) - hr = hr2; - } - - hr2 = pBDAControl->CommitChanges(); - if (hr2 != S_OK) { - addStr(pstrErr, TEXT("CommitChanges(): hr=0x%08x"), hr2); - if (hr == S_OK) - hr = hr2; - } -#endif - return hr; -} - -/** * Branchement d'une piste sonore. * \param[in] pid PID de la piste brancher * \param[in] type Type de la piste audio **/ -HRESULT CPTvM_TunerGraph::branche_son(UINT16 pid, TrackStreamType type) +HRESULT CPTvM_FullGraph::branche_son(UINT16 pid, TrackStreamType type) { HRESULT hr = E_FAIL; @@ -1812,7 +1939,7 @@ /** * Dbranchement de toutes les pistes sonores **/ -void CPTvM_TunerGraph::debranche_son() +void CPTvM_FullGraph::debranche_son() { sMp2aCodec.debranche_pids(); sAc3_Codec.debranche_pids(); @@ -1824,7 +1951,7 @@ * \param[in] pid PID de la piste brancher * \param[in] type Type de la piste audio **/ -HRESULT CPTvM_TunerGraph::change_son(UINT16 pid, TrackStreamType type) +HRESULT CPTvM_FullGraph::change_son(UINT16 pid, TrackStreamType type) { debranche_son(); return branche_son(pid, type); @@ -1835,36 +1962,36 @@ * \param[in] eVideoType Codec slectionner * \param[in] video_pid si != 0, branchement de ce PID au dmultiplexeur en mme temps **/ -HRESULT CPTvM_TunerGraph::select_video_codec(VideoStreamType eVideoType, UINT16 video_pid) +HRESULT CPTvM_FullGraph::select_video_codec(VideoStreamType eVideoType, UINT16 video_pid) { HRESULT hr=E_FAIL; // par dfaut switch (eVideoType) { case vst_Unknown: // audio seul, par exemple ... - if (pVMR && ePrevVideoType!=vst_Unknown) { + if (pVMR && eCurrVideoType!=vst_Unknown) { if (FAILED(hr = switch_codec(NULL))) return hr; - ePrevVideoType = vst_Unknown; + eCurrVideoType = vst_Unknown; } hr = S_OK; break; case vst_MPEG2: - if (pVMR && ePrevVideoType!=vst_MPEG2) { + if (pVMR && eCurrVideoType!=vst_MPEG2) { if (FAILED(hr = switch_codec(&sMp2vCodec))) return hr; - ePrevVideoType = vst_MPEG2; + eCurrVideoType = vst_MPEG2; } if (video_pid) hr = sMp2vCodec.branche_pid(video_pid); break; case vst_H264: - if (pVMR && ePrevVideoType!=vst_H264) { + if (pVMR && eCurrVideoType!=vst_H264) { if (FAILED(hr = switch_codec(&sH264Codec))) return hr; - ePrevVideoType = vst_H264; + eCurrVideoType = vst_H264; } if (video_pid) hr = sH264Codec.branche_pid(video_pid); @@ -1883,7 +2010,7 @@ * \param[in] eAudioType Type du flux audio * \return Code d'erreur DirectShow **/ -HRESULT CPTvM_TunerGraph::branche_medias(UINT16 pmt_pid, UINT16 video_pid, VideoStreamType eVideoType, UINT16 audio_pid, TrackStreamType eAudioType) +HRESULT CPTvM_FullGraph::branche_medias(UINT16 pmt_pid, UINT16 video_pid, VideoStreamType eVideoType, UINT16 audio_pid, TrackStreamType eAudioType) { HRESULT hr = E_FAIL; // valeur par dfaut @@ -1903,7 +2030,7 @@ /** * Dbranchement de tous les mdias **/ -void CPTvM_TunerGraph::debranche_medias() +void CPTvM_FullGraph::debranche_medias() { if (!bSuspended) { sMp2vCodec.debranche_pids(); @@ -1921,7 +2048,7 @@ * \param[in] volume Nouveau volume sonore, valeur de 0 100 * \return Code d'erreur DirectShow **/ -HRESULT CPTvM_TunerGraph::set_volume(long volume) +HRESULT CPTvM_FullGraph::set_volume(long volume) { CComQIPtr pBas(pFGrph); @@ -1938,7 +2065,7 @@ /** * Obtenir l'interface \p Mpeg2Data (pour la recherche de chanes) **/ -CComPtr CPTvM_TunerGraph::GetMpeg2Data() +CComPtr CPTvM_FullGraph::GetMpeg2Data() { CComPtr pMpeg2Data; HRESULT hr = sPSI_Filter.pFilter.QueryInterface(&pMpeg2Data); @@ -1960,7 +2087,7 @@ * \brief Appel du dialogue de proprits d'un filtre * \param[in] eFltType Type du filtre dont le dialogue de proprits doit tre appel **/ -void CPTvM_TunerGraph::create_property_dialog(FilterType eFltType) +void CPTvM_FullGraph::create_property_dialog(FilterType eFltType) { switch (eFltType) { case ft_Video_Mp2v: sMp2vCodec.create_property_dialog(); break; @@ -2004,7 +2131,7 @@ * \param[in] eFltType Type du filtre pour lequel l'existence du dialogue doit tre vrifie * \return \p true si un dialogue de proprits existe pour ce filtre **/ -bool CPTvM_TunerGraph::check_property_dialog(FilterType eFltType) +bool CPTvM_FullGraph::check_property_dialog(FilterType eFltType) { switch (eFltType) { case ft_Video_Mp2v: return sMp2vCodec.check_property_dialog(); @@ -2048,7 +2175,7 @@ if (!pGraph) return; - IBDA_SignalStatistics * pStats = dynamic_cast(pGraph)->pStats; + IBDA_SignalStatistics * pStats = dynamic_cast(pGraph)->pStats; if (!pStats) // pStats parfois NULL transitoirement si fermeture du programme return; // avec fentre de statistiques ouverte Modifié: trunk/graph.h =================================================================== --- trunk/graph.h 2009-12-04 10:55:31 UTC (rev 209) +++ trunk/graph.h 2009-12-04 14:10:22 UTC (rev 210) @@ -53,6 +53,9 @@ ft_Renderer //!< Rendu vido }; +/// Largeur de bande utilise +#define DVBT_BANDWIDTH 8 + // ==================================================================================== // Interfaces d'accs au graphe // ==================================================================================== @@ -85,7 +88,7 @@ * \param[in] dest Filtre prsentant la broche d'entre connecter * \return Code d'erreur DirectShow **/ - virtual HRESULT connect_filters(CComPtr & source, CComPtr & dest) = 0; + virtual HRESULT connect_filters(IBaseFilter * source, IBaseFilter * dest) = 0; /** * Dconnexion de la broche d'entre d'un filtre de la broche de sortie du filtre qui le prcde. @@ -135,15 +138,39 @@ #endif EndInterface +// ==================================================================================== + DeclareBasedInterface(IPTvM_TunerGraph, virtual IPTvM_GraphBase) /** * Syntonisation d'une frquence dans le tuner. - * \param[in] freq Frquence syntoniser, exprime en kilohertz - * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL + * \param[in] nFreq Frquence syntoniser, exprime en kilohertz + * \param[in] nBandwidth Largeur de bande, exprime en megahertz + * \param[in] pChIDs Autres informations optionnelles concernant la chane + * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL **/ - virtual HRESULT change_frequence(ULONG freq, tstring * pstrErr=NULL) = 0; + virtual HRESULT change_frequence(LONG nFreq, LONG nBandwidth, const ChaineIDs * pChIDs=NULL, tstring * pstrErr=NULL) = 0; /** + * Ajout d'un filtre la fin du tronc principal du graphe. + * \param[in] pFilter Filtre ajouter + * \param[in] pszName Nom qui lui sera attribu + * \return Code d'erreur DirectShow + **/ + virtual HRESULT PushFilter(IBaseFilter * pFilter, LPCTSTR pszName) = 0; + + /** + * Identification du type de graphe. + * \retval false Normal + * \retval true Alternatif + **/ + virtual bool isLegacyGraph() const = 0; +EndInterface + +// ==================================================================================== + +DeclareBasedInterface(IPTvM_FullGraph, virtual IPTvM_TunerGraph) + + /** * Changement de volume sonore * \param[in] volume Nouveau volume sonore, valeur de 0 100 * \return Code d'erreur DirectShow @@ -213,13 +240,12 @@ /// Pointeur d'accs global au graphe // ==================================================================================== -extern IPTvM_TunerGraph * pGraph; +extern IPTvM_FullGraph * pGraph; // ==================================================================================== // Fonctions globales // ==================================================================================== - /** * Construction et mise en route du graphe DirectShow * \param[in] eVideoType Type de flux vido initial (prsum si inconnu) Modifié: trunk/parse.cpp =================================================================== --- trunk/parse.cpp 2009-12-04 10:55:31 UTC (rev 209) +++ trunk/parse.cpp 2009-12-04 14:10:22 UTC (rev 210) @@ -339,7 +339,7 @@ // Choppe le tunning space tstring strErr; - HRESULT hr = pGraph->change_frequence(khz, &strErr); + HRESULT hr = pGraph->change_frequence(khz, DVBT_BANDWIDTH, NULL, &strErr); if (FAILED(hr)) { log(TEXT("Erreur(s) au changement de frquence : %s") EOL, strErr.c_str()); @@ -358,7 +358,7 @@ log(TEXT("Pas de signal ; essai +5 kHz = %i kHz") EOL, khz); // Choppe le tunning space - hr = pGraph->change_frequence(khz, &strErr); + hr = pGraph->change_frequence(khz, DVBT_BANDWIDTH, NULL, &strErr); if (FAILED(hr)) { log(TEXT("Erreur(s) au changement de frquence : %s") EOL, strErr.c_str()); From pouchintv-dev at baysse.fr Fri Dec 4 16:06:25 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Fri, 04 Dec 2009 15:06:25 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r211 - trunk Message-ID: <20091204150618.9A35F5F75A@mail.baysse.fr> Author: gingko Date: 2009-12-04 16:06:18 +0100 (ven 04 déc 2009) New Revision: 211 Modified: trunk/changelog.html trunk/config.h trunk/graph.cpp trunk/graph.h Log: Utilisation des interfaces "tuning space" dans le graphe graph.h, graph.cpp : * Le changement de chaîne utilise maintenant les interfaces "tuning space" spécialement définie à cet effet dans le Microsoft Unified Tuning Model, dans le graphe "normal". * Le graphe alternatif continue, lui, à utiliser l'ancienne méthode. config.h : * Une macro de configuration "USE_TUNING_SPACE" est ajoutée afin de permettre de revenir à la situation précédente au cas où des problèmes apparaîtraient, ou bien encore à des fins de comparaisons. * Bien que ceci ne fonctionne pas correctement (voir commentaire dans "config.h"), une autre macro "USE_EXISTING_DEMUX_PINS" (inactive) est ajoutée, afin de permettre de faire des tests de connexions aux broches automatiquement ajoutées au démultiplexeur par le filtre "BDA MPEG2 Transport Information Filter", sur les sorties audio et vidéo. Modifié: trunk/changelog.html =================================================================== --- trunk/changelog.html 2009-12-04 14:10:22 UTC (rev 210) +++ trunk/changelog.html 2009-12-04 15:06:18 UTC (rev 211) @@ -56,6 +56,13 @@

Changements réalisés pour la version 0.5

+
SVN rév. 211 :
+
    +
  • Utilisation des interfaces tuning space pour sélectionner les chaînes, dans le graphe + non alternatif.
  • +
+
+
0.5.208 (expérimentale, publiée dans le forum le 11 novembre 2009) :
  • Ajout de la prise en charge des radios numériques DVB telles que celles qu'on peut avoir en Belgique.
  • Modifié: trunk/config.h =================================================================== --- trunk/config.h 2009-12-04 14:10:22 UTC (rev 210) +++ trunk/config.h 2009-12-04 15:06:18 UTC (rev 211) @@ -62,11 +62,29 @@ #define USE_AUTO_RETUNE 1 /** + * Si cette macro est 1, le logiciel tente d'utiliser les broches existantes du + * dmultiplexeur (pour l'audio et la vido) et n'en cre de nouvelles que l o aucune + * broche approprie n'existe. + * \note La prsence de telles broches n'est possible que si le filtre + * "BDA MPEG2 Transport Information Filter" est utilis, et elle pose un problme encore + * rsoudre qui est que ces broches sont sujets des "MapPID/UnmapPID" automatiques + * qui entrent en conflit avec les ntres. De plus, ceci est susceptible d'empcher la + * dconnexion des sorties lorsque le programme est minimis. + **/ +#define USE_EXISTING_DEMUX_PINS 0 + +/** * Activation / dsactivation de l'utilisation du filtre PMT **/ #define USE_PMTFILTER 1 /** +/** + * Utilisation des interfaces "tuning space" pour slectionner les canaux et les chanes. + **/ +#define USE_TUNING_SPACE 1 + +/** * Macro permettant d'activer ou de dsactiver l'exportation du graphe * ( l'usage de Graphedit ou d'un logiciel quivalent, genre GraphStudio). **/ Modifié: trunk/graph.cpp =================================================================== --- trunk/graph.cpp 2009-12-04 14:10:22 UTC (rev 210) +++ trunk/graph.cpp 2009-12-04 15:06:18 UTC (rev 211) @@ -308,6 +308,108 @@ #endif // #if EXPORT_GRAPH // ==================================================================================== +/// "Tuning space" et "tune requests" +// ==================================================================================== + +#if USE_TUNING_SPACE + +class CDVBTTuningSpace +{ + friend class CDVBTTuneRequest; + + CComPtr pTuningSpace; +public: + CDVBTTuningSpace(HRESULT * phr = NULL); + + HRESULT GetNetworkType(CLSID & clsid) const { + return pTuningSpace ? pTuningSpace->get__NetworkType(&clsid) : E_NOINTERFACE;} +}; + +CDVBTTuningSpace::CDVBTTuningSpace(HRESULT * phr) +{ + HRESULT hr = pTuningSpace.CoCreateInstance(CLSID_DVBTuningSpace); + + if (SUCCEEDED(hr)) { + CComQIPtr pDVBTuningSpace(pTuningSpace); + + if (pDVBTuningSpace) { + hr = pDVBTuningSpace->put_SystemType(DVB_Terrestrial); + if (SUCCEEDED(hr)) { + //CComBSTR bstrNetworkType = "{216C62DF-6D7F-4E9A-8571-05F14EDB766A}"; // DVB_TERRESTRIAL_TV_NETWORK_TYPE + //hr = pDVBTuningSpace->put_NetworkType(bstrNetworkType); + hr = pDVBTuningSpace->put__NetworkType(DVB_TERRESTRIAL_TV_NETWORK_TYPE); + } + } else + hr = E_NOINTERFACE; + } + + if (phr) + *phr = hr; +} + +class CDVBTTuneRequest +{ + CDVBTTuningSpace & cTuningSpace; + CComPtr pTuneRequest; +public: + CDVBTTuneRequest(CDVBTTuningSpace & cTunSpace, long frequency, long bandwidth, long ONID, long TSID, long SID, HRESULT * phr = NULL); + + operator ITuneRequest * () const { + return pTuneRequest;} +}; + +CDVBTTuneRequest::CDVBTTuneRequest(CDVBTTuningSpace & cTunSpace, long frequency, long bandwidth, long ONID, long TSID, long SID, HRESULT * phr) : + cTuningSpace(cTunSpace) +{ + HRESULT hr = S_OK; + + if (cTuningSpace.pTuningSpace) { + //Get an interface to the TuningSpace + CComQIPtr pDVBTuningSpace(cTuningSpace.pTuningSpace); + + if (pDVBTuningSpace) { + //Get new TuneRequest from tuning space + hr = pDVBTuningSpace->CreateTuneRequest(&pTuneRequest); + if (SUCCEEDED(hr)) { + //Get interface to the TuneRequest + CComQIPtr pDVBTuneRequest(pTuneRequest); + + if (pDVBTuneRequest) { + CComPtr pDVBTLocator; + + hr = pDVBTLocator.CoCreateInstance(CLSID_DVBTLocator); + if (SUCCEEDED(hr)) { + hr = pDVBTLocator->put_CarrierFrequency(frequency); + if (SUCCEEDED(hr)) { + hr = pDVBTLocator->put_Bandwidth(bandwidth); + if (SUCCEEDED(hr)) { + // Bind the locator to the tune request. + hr = pDVBTuneRequest->put_Locator(pDVBTLocator); + + if (SUCCEEDED(hr)) + hr = pDVBTuneRequest->put_ONID(ONID); + if (SUCCEEDED(hr)) + hr = pDVBTuneRequest->put_TSID(TSID); + if (SUCCEEDED(hr)) + hr = pDVBTuneRequest->put_SID(SID); + } + } + } + } else + hr =E_NOINTERFACE; + } + } else + hr = E_NOINTERFACE; + } else + hr = E_INVALIDARG; + + if (phr) + *phr = hr; +} + +#endif + +// ==================================================================================== /// Classe de base de construction du graphe // ==================================================================================== @@ -728,8 +830,10 @@ CComPtr pStats; +#if USE_TUNING_SPACE == 0 CComPtr pBDAControl; CComPtr pBDAFreq; +#endif CPTvM_TunerGraph() : pTailFilter(NULL) @@ -754,6 +858,7 @@ /// Construction du graphe HRESULT Build(); +#if USE_TUNING_SPACE == 0 /** * Syntonisation d'une frquence dans le tuner. * \param[in] nFreq Frquence syntoniser, exprime en kilohertz @@ -762,6 +867,7 @@ * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL **/ virtual HRESULT change_frequence(LONG nFreq, LONG nBandwidth, const ChaineIDs * pChIDs=NULL, tstring * pstrErr=NULL); +#endif virtual ~CPTvM_TunerGraph() {} }; @@ -942,6 +1048,16 @@ { FilterData sNetworkProvider; +#if USE_TUNING_SPACE + CComPtr pBDAControl; + CComPtr pBDAFreq; + + HRESULT change_frequence(LONG nFreq, LONG nBandwidth, const ChaineIDs * pChIDs, tstring * pstrErr); + + /// Rcupration des interfaces du filtre tuner + virtual HRESULT QueryTunerInterfaces(); +#endif + virtual HRESULT AddProvider(); /** @@ -970,6 +1086,23 @@ return hr; } +#if USE_TUNING_SPACE +/// Rcupration des interfaces du filtre tuner +HRESULT CLegacyTunerGraph::QueryTunerInterfaces() +{ + HRESULT hr; + + hr = pNetworkTuner.QueryInterface(&pBDAControl); + if (FAILED(hr)) + return erreur(TEXT("L'interface IBDA_DeviceControl n'a pas t trouve"), hr); + + hr = Search_IBDA_Topology(pNetworkTuner, pBDAFreq); + if (FAILED(hr)) + return erreur(TEXT("L'interface de changement de frquence n'a pas t trouve"), hr); + return __super::QueryTunerInterfaces(); +} +#endif // #if USE_TUNING_SPACE + /// Ajout informations si \p pstr non \p NULL static void addStr(tstring * pstr, LPCTSTR pszFmt, ...) { @@ -989,7 +1122,11 @@ * \param[in] pChIDs Autres informations optionnelles concernant la chane * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL **/ +#if USE_TUNING_SPACE +HRESULT CLegacyTunerGraph::change_frequence(LONG nFreq, LONG nBandwidth, const ChaineIDs * pChIDs, tstring * pstrErr) +#else HRESULT CPTvM_TunerGraph::change_frequence(LONG nFreq, LONG nBandwidth, const ChaineIDs * pChIDs, tstring * pstrErr) +#endif { if (!pBDAControl || !pBDAFreq) return E_FAIL; @@ -1051,9 +1188,26 @@ { FilterData sNetworkProvider; +#if USE_TUNING_SPACE + CDVBTTuningSpace cTuningSpace; +#endif + virtual HRESULT AddProvider(); +#if USE_TUNING_SPACE + virtual HRESULT ApplyTuneRequest(ITuneRequest * pTuneRequest); + /** + * Syntonisation d'une frquence dans le tuner. + * \param[in] nFreq Frquence syntoniser, exprime en kilohertz + * \param[in] nBandwidth Largeur de bande, exprime en megahertz + * \param[in] pChIDs Autres informations optionnelles concernant la chane + * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL + **/ + virtual HRESULT change_frequence(LONG nFreq, LONG nBandwidth, const ChaineIDs * pChIDs=NULL, tstring * pstrErr=NULL); +#endif + + /** * Identification du type de graphe. * \retval false Normal * \retval true Alternatif @@ -1079,6 +1233,39 @@ return hr; } +#if USE_TUNING_SPACE +HRESULT CMicrosoftTunerGraph::ApplyTuneRequest(ITuneRequest * pTuneRequest) +{ + CComQIPtr pTuner(sNetworkProvider.pFilter); + if (!pTuner) + return E_NOINTERFACE; + + return pTuner->put_TuneRequest(pTuneRequest); +} + +/** + * Syntonisation d'une frquence dans le tuner. + * \param[in] nFreq Frquence syntoniser, exprime en kilohertz + * \param[in] nBandwidth Largeur de bande, exprime en megahertz + * \param[in] pChIDs Autres informations optionnelles concernant la chane + * \param[in] pstrErr Pointeur sur une variable recevant un dtail des erreurs si non NULL + **/ +HRESULT CMicrosoftTunerGraph::change_frequence(LONG nFreq, LONG nBandwidth, const ChaineIDs * pChIDs, tstring * pstrErr) +{ + HRESULT hr; + CDVBTTuneRequest cTuneRequest(cTuningSpace, nFreq+offset_tuner, nBandwidth, + pChIDs ? pChIDs->ONID : -1, + pChIDs ? pChIDs->TSID : -1, + pChIDs ? pChIDs->SID : -1, + &hr); + + if (FAILED(hr)) + return hr; + + return ApplyTuneRequest(cTuneRequest); +} +#endif // USE_TUNING_SPACE + class CMicrosoftFullGraph : public CMicrosoftTunerGraph, public CPTvM_FullGraph { virtual HRESULT AddDataFilters(IMpeg2Demultiplexer & iMp2Demux); @@ -1291,7 +1478,7 @@ return S_OK; CComPtr pOutPin; - HRESULT hr = get_output_pin(iMp2Demux, sDData, false, pOutPin); + HRESULT hr = get_output_pin(iMp2Demux, sDData, USE_EXISTING_DEMUX_PINS, pOutPin); if (FAILED(hr)) return hr; @@ -1325,7 +1512,7 @@ return S_OK; CComPtr pOutPin; - HRESULT hr = get_output_pin(iMp2Demux, sDData, false, pOutPin); + HRESULT hr = get_output_pin(iMp2Demux, sDData, USE_EXISTING_DEMUX_PINS, pOutPin); if (FAILED(hr)) return hr; @@ -1747,12 +1934,14 @@ View_IBDA_Topology(pNetworkTuner); #endif +#if USE_TUNING_SPACE == 0 hr = pNetworkTuner.QueryInterface(&pBDAControl); if (FAILED(hr)) return erreur(TEXT("L'interface IBDA_DeviceControl n'a pas t trouve"), hr); hr = Search_IBDA_Topology(pNetworkTuner, pBDAFreq); if (FAILED(hr)) return erreur(TEXT("L'interface de changement de frquence n'a pas t trouve"), hr); +#endif hr = Search_IBDA_Topology(pNetworkTuner, pStats); if (FAILED(hr)) return erreur(TEXT("L'interface de qualit du signal n'a pas t trouve"), hr); Modifié: trunk/graph.h =================================================================== --- trunk/graph.h 2009-12-04 14:10:22 UTC (rev 210) +++ trunk/graph.h 2009-12-04 15:06:18 UTC (rev 211) @@ -33,6 +33,10 @@ #include "rendering.h" #include +#if USE_TUNING_SPACE + #include +#endif + // ==================================================================================== extern CLSID MEDIASUBTYPE_DOLBY_DDPLUS; From pouchintv-dev at baysse.fr Fri Dec 4 21:37:40 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Fri, 04 Dec 2009 20:37:40 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r212 - trunk Message-ID: <20091204203725.1D2625F75A@mail.baysse.fr> Author: gingko Date: 2009-12-04 21:37:24 +0100 (ven 04 déc 2009) New Revision: 212 Modified: trunk/changelog.html trunk/chanutils.cpp trunk/ini.cpp trunk/ini.h trunk/main.cpp trunk/search.h trunk/settings.cpp Log: Correctifs mineurs, ajout d'éléments oubliés dans les livraisons précédentes. settings.cpp : * Si un filtre est manquant au moment de la configuration, son nom est préfixé des caractères " " dans la liste déroulante, afin qu'il soit visible que cet élément n'est pas valide. * Ajout de la fonction "copy_check", pour factorisation (utilisée ici une seule fois, mais d'autres sont à venir) chanutils.cpp : * Correction : zéro binaire oublié dans une chaîne ini.h, ini.cpp, search.h, settings.cpp : * Correction des les commentaires ou le formatage main.cpp : * Ajustement oublié dans les #if USE_LOGITECH_LCD Modifié: trunk/changelog.html =================================================================== --- trunk/changelog.html 2009-12-04 15:06:18 UTC (rev 211) +++ trunk/changelog.html 2009-12-04 20:37:24 UTC (rev 212) @@ -56,6 +56,13 @@

    Changements réalisés pour la version 0.5

    +
    SVN rév. 212 :
    +
      +
    • Si un filtre est manquant au moment de la configuration, son nom est préfixé des caractères + <?> dans la liste déroulante, afin qu'il soit visible que cet élément n'est pas valide.
    • +
    +
    +
    SVN rév. 211 :
    • Utilisation des interfaces tuning space pour sélectionner les chaînes, dans le graphe Modifié: trunk/chanutils.cpp =================================================================== --- trunk/chanutils.cpp 2009-12-04 15:06:18 UTC (rev 211) +++ trunk/chanutils.cpp 2009-12-04 20:37:24 UTC (rev 212) @@ -76,7 +76,7 @@ _stprintf_s(pszBuf, nBufSiz, TEXT("pid=%4u, type="), pid); if (type=tst_Other_BEG && type<=tst_Other_END) strcat_T(pszBuf, nBufSiz, EnumToString(type-tst_Other_BEG, "Sous-titrage\0Teletext\0")); else Modifié: trunk/ini.cpp =================================================================== --- trunk/ini.cpp 2009-12-04 15:06:18 UTC (rev 211) +++ trunk/ini.cpp 2009-12-04 20:37:24 UTC (rev 212) @@ -714,10 +714,10 @@ // %h = heure // %M = minute // %s = secondes - int sav_pos = -1; // sauvegarde du dbut du groupe ignorer si la prochaine zone est vide - // aprs un point d'interrogation - int lit_pos = -1; // sauvegarde du dbut du groupe ignorer si la zone prcdente tait vide - // et qu'un point d'interrogation est ensuite rencontr + int sav_pos = -1; // sauvegarde du dbut du groupe ignorer si la prochaine zone est vide + // aprs un point d'interrogation + int lit_pos = -1; // sauvegarde du dbut du groupe ignorer si la zone prcdente tait vide + // et qu'un point d'interrogation est ensuite rencontr int lmotif = (int)strlen_T(motif_noms_enreg); for (int i=0; iset_volume(muted ? 0 : volumeCourant); @@ -1425,10 +1425,10 @@ if (!muted) pGraph->set_volume(volumeCourant); -#ifdef USE_LOGITECH_LCD +#if USE_LOGITECH_LCD lcd.SetVolume(volumeCourant); lcd.ActualiseLcd(); -#endif // #ifdef USE_LOGITECH_LCD +#endif // #if USE_LOGITECH_LCD if (pOSD) pOSD->DisplayVolume(volumeCourant); } Modifié: trunk/search.h =================================================================== --- trunk/search.h 2009-12-04 15:06:18 UTC (rev 211) +++ trunk/search.h 2009-12-04 20:37:24 UTC (rev 212) @@ -56,9 +56,9 @@ /** * Mthode virtuelle "pure" appele pour chaque filtre trouv. * \param[in] cMnkb Structure contenant les informations de recherche - * \retval S_OK si l'numration doit ensuite continuer - * \retval S_FALSE si l'numration doit s'arrter (par exemple parce qu'on - * a trouv ce qu'on cherchait) + * \retval S_OK si l'numration doit ensuite continuer + * \retval S_FALSE si l'numration doit s'arrter (par exemple parce qu'on + * a trouv ce qu'on cherchait) **/ virtual HRESULT ApplyOne(MonikerBindings & cMnkb) = 0; Modifié: trunk/settings.cpp =================================================================== --- trunk/settings.cpp 2009-12-04 15:06:18 UTC (rev 211) +++ trunk/settings.cpp 2009-12-04 20:37:24 UTC (rev 212) @@ -37,7 +37,7 @@ #include /** - * Classe de base pour grer un dialog modal en tant qu'objet + * Classe de base pour grer un dialogue modal en tant qu'objet * \todo Grer les feuilles de proprits l'aide de ceci **/ class ModalDialogBase @@ -145,11 +145,9 @@ /** * Coche la case de l'lment checkbox correspondant * - * \param[in] hDlg handle de la boite de dialogue contenant l'lment cocher - * \param[in] nID identifiant de l'lment - * \param[in] state valeur :\n - * \a true si on veut cocher\n - * \a false si on veut dcocher + * \param[in] hDlg handle de la boite de dialogue contenant l'lment cocher + * \param[in] nID identifiant de l'lment + * \param[in] state \p true ou \p false selon qu'on veut cocher ou dcocher **/ inline bool set_check(HWND hDlg, int nID, bool state) { @@ -159,8 +157,8 @@ /** * Dfinit le texte de l'lment correspondant * - * \param[in] hElmnt handle de de l'lment dont le texte doit tre modifi - * \param[in] texte texte afficher + * \param[in] hElmnt Handle de de l'lment dont le texte doit tre modifi + * \param[in] texte Texte afficher **/ inline bool set_text(HWND hElmnt, LPCTSTR texte) { @@ -283,6 +281,23 @@ } /** + * Assignation d'une chane sur une autre avec test modification + * + * \param[in] pszSrc Chane source + * \param[in,out] pszDst Chane destination + * \param[in] nSize Taille du tampon de cette chane + * \retval \p true si la chane destination a t modifie + * \retval \p false si la nouvelle valeur tait identique l'ancienne + **/ +static bool copy_check(LPTSTR pszDst, UINT nSize, LPCTSTR pszSrc) +{ + if (_tcscmp(pszDst, pszSrc)==0) + return false; // false = Aucun changement + strcpy_T(pszDst, nSize, pszSrc); + return true; // true = Changement +} + +/** * Rcupre la valeur textuelle slectionne dans la liste droulante * * \param[in] hItm handle de la liste droulante dans la boite de dialogue @@ -312,10 +327,7 @@ return false; } - if (_tcscmp(nom, temp)==0) - return false; // false = Aucun changement - strcpy_T(nom, size, temp); - return true; // true = Changement + return copy_check(nom, size, temp); } /** @@ -1311,10 +1323,14 @@ if (IsNullName(nom)) SendMessage(hItm, CB_SETCURSEL, 0, 0); else if (SendMessage(hItm, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)nom)==CB_ERR) { - // L'lment prcdemment slectionn n'existe plus ! On l'ajoute quand mme : - SendMessage(hItm, CB_ADDSTRING, 0, (LPARAM)nom); + // L'lment prcdemment slectionn n'existe plus ! On l'ajoute quand mme, + // avec un inquitant en prfixe : + tstring strMissing = TEXT(" "); + + strMissing += nom; + SendMessage(hItm, CB_ADDSTRING, 0, (LPARAM)strMissing.c_str()); // ... et on le slectionne : - SendMessage(hItm, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)nom); + SendMessage(hItm, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)strMissing.c_str()); return false; } return true; @@ -1405,8 +1421,9 @@ **/ bool drivers_apply(HWND hDlg) { + bool changed = false; // Est-ce qu'il y a eu une modification ? - bool changed = extrait_combo(GetDlgItem(hDlg, IDC_COMBO_TUNER), nom_tuner, _countof(nom_tuner), false); + changed = extrait_combo(GetDlgItem(hDlg, IDC_COMBO_TUNER), nom_tuner, _countof(nom_tuner), false); // Si le tuner a chang, lire maintenant les autres paramtres qui lui sont associs // (avant de rcuprer le rcepteur, dont le nom avait dj t copi dans la liste @@ -1427,9 +1444,18 @@ changed |= extrait_combo(GetDlgItem(hDlg, IDC_COMBO_EAC3), filtreEac3, _countof(filtreEac3), true); myprintf( - TEXT("Nouvelle configuration :\nTuner : %s\nReceiver : %s\nVideo : %s") EOL - TEXT("Audio : %s\nAc3 : %s\nEac3 : %s") EOL, - nom_tuner, nom_receiver, filtreMPEG2, filtreAudio, filtreAc3, filtreEac3); + TEXT("Nouvelle configuration :") EOL + TEXT("Tuner : %s") EOL + TEXT("Receiver : %s") EOL + TEXT("Video : %s") EOL + TEXT("- H264 : %s") EOL + TEXT("Audio : %s") EOL + TEXT("- Ac3 : %s") EOL + TEXT("- Eac3 : %s") EOL, + nom_tuner, + nom_receiver, + filtreMPEG2, filtreH264, + filtreAudio, filtreAc3, filtreEac3); if (changed && _tcsstr(filtreMPEG2, TEXT("ffdshow")) && _tcsstr(filtreH264, TEXT("ffdshow"))) { MessageBoxCheck(hDlg, @@ -1481,12 +1507,13 @@ tstring strListeAbsents; if (!remplit_combo_tuner(hTuner, KSCATEGORY_BDA_NETWORK_TUNER, nom_tuner)) - strListeAbsents += tstr_printf(EOL TEXT("- %s"), nom_tuner); + strListeAbsents = tstr_printf(EOL TEXT("- %s"), nom_tuner); if (!remplit_combo_tuner(hReceiver, KSCATEGORY_BDA_RECEIVER_COMPONENT, nom_receiver)) strListeAbsents += tstr_printf(EOL TEXT("- %s"), nom_receiver); if (!remplit_combo_filtre(hMpeg2, MEDIATYPE_Video, MEDIASUBTYPE_MPEG2_VIDEO, filtreMPEG2)) strListeAbsents += tstr_printf(EOL TEXT("- %s"), filtreMPEG2); - remplit_combo_filtre(hH264, MEDIATYPE_Video, MEDIASUBTYPE_H264, filtreH264); + if (!remplit_combo_filtre(hH264, MEDIATYPE_Video, MEDIASUBTYPE_H264, filtreH264)) + strListeAbsents += tstr_printf(EOL TEXT("- %s"), filtreH264); if (!remplit_combo_filtre(hAudio, MEDIATYPE_Audio, MEDIASUBTYPE_MPEG2_AUDIO, filtreAudio)) strListeAbsents += tstr_printf(EOL TEXT("- %s"), filtreAudio); if (!remplit_combo_filtre(hAc3, MEDIATYPE_Audio, MEDIASUBTYPE_DOLBY_AC3, filtreAc3)) @@ -1531,6 +1558,9 @@ case _cmd_(IDC_COMBO_H264, CBN_SELCHANGE): case _cmd_(IDC_COMBO_AUDIO, CBN_SELCHANGE): case _cmd_(IDC_COMBO_AC3, CBN_SELCHANGE): + PropSheet_Changed(GetParent(hDlg), hDlg); + break; + case _cmd_(IDC_ALT_GRAPH, BN_CLICKED): PropSheet_Changed(GetParent(hDlg), hDlg); break; From pouchintv-dev at baysse.fr Sat Dec 5 02:56:00 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Sat, 05 Dec 2009 01:56:00 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r213 - trunk Message-ID: <20091205015544.10C395F75A@mail.baysse.fr> Author: gingko Date: 2009-12-05 02:55:42 +0100 (sam 05 déc 2009) New Revision: 213 Modified: trunk/changelog.html trunk/config.h trunk/filters.cpp trunk/filters.h trunk/graph.cpp trunk/graph.h trunk/ini.cpp trunk/ini.h trunk/main.cpp trunk/parse.cpp trunk/res.rc trunk/resource.h trunk/search.cpp trunk/search.h trunk/settings.cpp Log: Implémentation d'une recherche de tuner avancée, simplifiée du point de vue de l'utilisateur. search.h, search.cpp : * La recherche de tuner utilise maintenant une nouvelle classe dénommée "CSearchTuner", qui retourne une liste de tuners, chacun défini par un nombre de filtres pouvant aller de un à trois (tuner + démodulateur (optionnel) + capture (optionnel). Ces filtres sont mémorisés, non plus par leur nom, mais par leur "device path". ini.h, ini.cpp : * Ajout de trois variables sauvegardées dans le fichier "config.ini", pour sauvegarder les "device path" de chacun de ces filtres. * La fonction "check_config" est réécrite afin de tenir compte de ces éléments. De plus, elle assure silencieusement la migration de configuration depuis les anciennes versions de Pouchin TV Mod, à la première utilisation de cette version. filters.h, filters.cpp : * La classe "MonikerBindings" reçoit une nouvelle fonction membre ainsi qu'un constructeur supplémentaire pour extraire le "device path", ainsi que pour se reconstruire à partir de celui-ci. graph.h, graph.cpp : * Le graphe lui-même est construit de manière à sélectionner son tuners à partir de ses "device path". * Ajout d'une fonction membre "PopFilter", pour permettre de retirer le dernier filtre ajouté dans le tronc principal du graphe, et ainsi, en association avec la fonction "PushFilter", permettre des tests "essai et erreur". settings.cpp, resource.h, res.rc : * Le dialogue de configuration des tuners est modifié pour exploiter cette recherche avancée : du point de vue de l'utilisateur, la notion de "récepteur" disparaît, et seul subsiste une liste déroulante pour choisir parmi les tuners disponibles. main.cpp, parse.cpp : * Modification de quelques fonctions de debugging et/ou de journalisation pour tenir compte de ces aménagements. config.h : * Ajout d'une macro de configuration "ADVANCED_TUNER_SEARCH" pour activer tous les changements précédemment cités, ou bien pour les désactiver et revenir à l'état précédent du logiciel. Modifié: trunk/changelog.html =================================================================== --- trunk/changelog.html 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/changelog.html 2009-12-05 01:55:42 UTC (rev 213) @@ -56,6 +56,15 @@

      Changements réalisés pour la version 0.5

      +
      SVN rév. 213 :
      +
        +
      • Implémentation de la recherche de tuner avancée :
          +
        • Il n'y a plus besoin de spécifier de récepteur dans le dialogue de configuration.
        • +
        • Cette disposition devrait permettre la compatibilité du logiciel avec un plus grand nombre + de tuners différents.
      • +
      +
      +
      SVN rév. 212 :
      • Si un filtre est manquant au moment de la configuration, son nom est préfixé des caractères Modifié: trunk/config.h =================================================================== --- trunk/config.h 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/config.h 2009-12-05 01:55:42 UTC (rev 213) @@ -79,6 +79,10 @@ #define USE_PMTFILTER 1 /** + * Essai d'implmentation de la mthode de recherche de ScbanChannelBDA. + **/ +#define ADVANCED_TUNER_SEARCH 1 + /** * Utilisation des interfaces "tuning space" pour slectionner les canaux et les chanes. **/ Modifié: trunk/filters.cpp =================================================================== --- trunk/filters.cpp 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/filters.cpp 2009-12-05 01:55:42 UTC (rev 213) @@ -276,6 +276,70 @@ return hr; } +#if ADVANCED_TUNER_SEARCH + +MonikerBindings::MonikerBindings(LPCTSTR pszDevicePath, HRESULT * phr) +{ + HRESULT hr = CreateBindCtx(0, &pBindCtx); + + if (SUCCEEDED(hr)) { + // Enlever les guillemets de part et d'autre, le cas chant + // (ces guillemets avaient t ajouts pour prserver les ventuelles espaces en fin de chane, + // lesquels n'auraient autrement pas t prservs dans le fichier de configuration) + OLECHAR szWrk[256]; + bool bHasQuotes = pszDevicePath[0] == TCHAR('['); + + strcpy_T(szWrk, pszDevicePath + (bHasQuotes ? 1 : 0)); + if (bHasQuotes) { + DWORD nLen = strlen_T(szWrk); + + while (nLen>0 && szWrk[nLen-1]==TCHAR(' ')) + szWrk[--nLen] = 0; // (un risque existe qu'il y ait quand mme aussi des espaces ajouts ...) + while (nLen>0 && szWrk[nLen-1]==TCHAR(']')) + szWrk[--nLen] = 0; + } + + DWORD dwEaten; + + hr = MkParseDisplayName(pBindCtx, szWrk, &dwEaten, &pMoniker); + myprintf(CMyP ERRX(TEXT("Erreur lecture device path, hr=0x%08x")), FAILED(hr), hr); + if (SUCCEEDED(hr) && pMoniker) + hr = BindProperties(); + } + + if (phr) + *phr = hr; +} + +/** + * Rcuprer le "device path" dans une variable \p tstring. Le "device path" contient lui seul + * toutes les informations ncessaires pour identifier un filtre existant de faon unique. + * \param[out] strDevicePath "Device path" rcupr + * \return Code d'erreur DirectShow + **/ +HRESULT MonikerBindings::GetDevicePath(tstring & strDevicePath) +{ + LPWSTR pszDisplayName; + HRESULT hr = pMoniker->GetDisplayName(pBindCtx, NULL, &pszDisplayName); + + + if (SUCCEEDED(hr)) { + strcpy_T(strDevicePath, pszDisplayName); + + // Libration de la mmoire alloue pour le nom + IMalloc * memAlloc = NULL; + + CoGetMalloc(1, &memAlloc); + memAlloc->Free(pszDisplayName); + /// \todo IMalloc->Release() ??? + } else + myprintf(ERRX(TEXT("Impossible de rcuprer le 'device path' du filtre \"%s\", hr=0x%08x")), strName.c_str(), hr); + + return hr; +} + +#endif // #if ADVANCED_TUNER_SEARCH + // ==================================================================================== // Recherche de broche dans un filtre // ==================================================================================== Modifié: trunk/filters.h =================================================================== --- trunk/filters.h 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/filters.h 2009-12-05 01:55:42 UTC (rev 213) @@ -223,13 +223,32 @@ **/ MonikerBindings(IMoniker * pMonikr, HRESULT * phr = NULL); +#if ADVANCED_TUNER_SEARCH /** + * Constructeur partir d'un "device path". + * \param[in] pszDevicePath Chane de caractres "device path" + * \param[in] phr Pointeur sur variable o mettre le code retour si non NULL + **/ + MonikerBindings(LPCTSTR pszDevicePath, HRESULT * phr = NULL); +#endif + + /** * Charger l'interface du filtre dans \p pFilter (non ralis la construction car pas * toujours requis et parfois gnant). * \return Code d'erreur DirectShow **/ HRESULT BindToFilter(); +#if ADVANCED_TUNER_SEARCH + /** + * Rcuprer le "device path" dans une variable \p tstring. Le "device path" contient lui seul + * toutes les informations ncessaires pour identifier un filtre existant de faon unique. + * \param[out] strDevicePath "Device path" rcupr + * \return Code d'erreur DirectShow + **/ + HRESULT GetDevicePath(tstring & strDevicePath); +#endif + /// Test validit des donnes bool isOk() const { return pPropBag && !strName.empty();} Modifié: trunk/graph.cpp =================================================================== --- trunk/graph.cpp 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/graph.cpp 2009-12-05 01:55:42 UTC (rev 213) @@ -850,6 +850,14 @@ **/ virtual HRESULT PushFilter(IBaseFilter * pFilter, LPCTSTR pszName); +#if ADVANCED_TUNER_SEARCH + /** + * Retrait du dernier filtre du tronc principal du graphe, avec restauration de l'tat prcdent. + * \return Code d'erreur DirectShow + **/ + virtual HRESULT PopFilter(); +#endif + /// Rcupration des interfaces du filtre tuner virtual HRESULT QueryTunerInterfaces(); @@ -1898,10 +1906,91 @@ return hr; } +#if ADVANCED_TUNER_SEARCH +/** + * Retrait du dernier filtre du tronc principal du graphe, avec restauration de l'tat prcdent. + * \return Code d'erreur DirectShow + **/ +HRESULT CPTvM_TunerGraph::PopFilter() +{ + PIN_INFO pin_info = {NULL}; + HRESULT hr; + + { // Trouver la broche d'entre du dernier filtre + CComPtr pInPin; + + hr = cherche_pin(pTailFilter, PINDIR_INPUT, pInPin); + if (FAILED(hr)) + return hr; + + CComPtr pOutPin; + + // Trouver la broche de sortie du filtre auquel il est connect + hr = pInPin->ConnectedTo(&pOutPin); + if (FAILED(hr)) + return hr; + + // Trouver quel fitre appartient cette broche de sortie + hr = pOutPin->QueryPinInfo(&pin_info); + if (pin_info.pFilter) + pin_info.pFilter->Release(); // liminer la rfrence en suspens (le pointeur reste valide) + // Ignorer le code retour : si pas de filtre, pTailFilter sera NULL + + } // -> sortie de bloc, pour s'assurer que les broches n'ont plus de rfrences en cours + + // Retirer le filtre + hr = pFGrph->RemoveFilter(pTailFilter); + if (FAILED(hr)) + return hr; + + // Le filtre prcdent devient le dernier de la file + pTailFilter = pin_info.pFilter; + return hr; +} +#endif // #if ADVANCED_TUNER_SEARCH + HRESULT CPTvM_TunerGraph::AddTunerAndReceiver() { HRESULT hr = E_FAIL; +#if ADVANCED_TUNER_SEARCH + MonikerBindings cMnkbTuner(szPathTuner, &hr); + + if (SUCCEEDED(hr)) + cMnkbTuner.BindToFilter(); + + // Ajout du tuner + if (SUCCEEDED(hr)) + hr = PushFilter(cMnkbTuner.pFilter, cMnkbTuner.strName.c_str()); + if (FAILED(hr)) + return erreur(TEXT("Tuner TNT non compatible, veuillez revoir la configuration et redmarrer"), hr); + + pNetworkTuner = cMnkbTuner.pFilter; + + // Ajout du filtre dmodulateur (optionnel et sans doute assez rare) + if (!IsNullName(szPathDemod)) { + MonikerBindings cMnkbDemod(szPathDemod, &hr); + + if (SUCCEEDED(hr)) + cMnkbDemod.BindToFilter(); + if (SUCCEEDED(hr)) + hr = PushFilter(cMnkbDemod.pFilter, cMnkbDemod.strName.c_str()); + if (FAILED(hr)) + return erreur(TEXT("Filtre dmodulateur TNT non compatible, veuillez revoir la configuration et redmarrer"), hr); + } + + // Ajout du filtre de capture (optionnel, mais le plus souvent prsent) + if (!IsNullName(szPathCapture)) { + MonikerBindings cMnkbCapture(szPathCapture, &hr); + + if (SUCCEEDED(hr)) + cMnkbCapture.BindToFilter(); + if (SUCCEEDED(hr)) + hr = PushFilter(cMnkbCapture.pFilter, cMnkbCapture.strName.c_str()); + if (FAILED(hr)) + return erreur(TEXT("Filtre de capture TNT non compatible, veuillez revoir la configuration et redmarrer"), hr); + } +#else CSearchByCategory_Get(KSCATEGORY_BDA_NETWORK_TUNER, nom_tuner, pNetworkTuner).Do(); // connect Tuner @@ -1921,6 +2010,7 @@ if (FAILED(hr)) return erreur(TEXT("Rcepteur TNT non compatible, veuillez revoir la configuration et redmarrer"), hr); } +#endif // #if ADVANCED_TUNER_SEARCH return QueryTunerInterfaces(); } @@ -2028,6 +2118,17 @@ return hr; } +#if ADVANCED_TUNER_SEARCH +/// Construction d'un graphe partiel (pour essais tuners), selon le type de graphe requis +IPTvM_TunerGraph * new_TunerGraph(bool bLegacy) +{ + if (bLegacy) + return new CLegacyTunerGraph(); + else + return new CMicrosoftTunerGraph(); +} +#endif + /// Construction du graphe complet, selon le type de graphe requis IPTvM_FullGraph * new_FullGraph(bool bLegacy, VideoStreamType eVideoType) { Modifié: trunk/graph.h =================================================================== --- trunk/graph.h 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/graph.h 2009-12-05 01:55:42 UTC (rev 213) @@ -162,7 +162,15 @@ **/ virtual HRESULT PushFilter(IBaseFilter * pFilter, LPCTSTR pszName) = 0; +#if ADVANCED_TUNER_SEARCH /** + * Retrait du dernier filtre du tronc principal du graphe, avec restauration de l'tat prcdent. + * \return Code d'erreur DirectShow + **/ + virtual HRESULT PopFilter() = 0; +#endif + + /** * Identification du type de graphe. * \retval false Normal * \retval true Alternatif @@ -250,6 +258,11 @@ // Fonctions globales // ==================================================================================== +#if ADVANCED_TUNER_SEARCH +/// Construction d'un graphe partiel (pour essais tuners), selon le type de graphe requis +IPTvM_TunerGraph * new_TunerGraph(bool bLegacy); +#endif + /** * Construction et mise en route du graphe DirectShow * \param[in] eVideoType Type de flux vido initial (prsum si inconnu) Modifié: trunk/ini.cpp =================================================================== --- trunk/ini.cpp 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/ini.cpp 2009-12-05 01:55:42 UTC (rev 213) @@ -200,6 +200,11 @@ // Valeurs sauvegardes sparment pour chaque type de tuner : TCHAR nom_receiver[256]; +#if ADVANCED_TUNER_SEARCH +TCHAR szPathTuner[256]; //!< "Device Path" du filtre tuner +TCHAR szPathDemod[256]; //!< "Device Path" du filtre dmodulateur +TCHAR szPathCapture[256]; //!< "Device Path" du filtre de capture +#endif INT32 offset_tuner = 0; bool try_adding_5khz = INI_TRY_ADDING_5KHZ_DEFAULT; // bool use_even_frequencies = false; @@ -520,7 +525,14 @@ static ConfigItem ini_tuner_items[] = { // Nom Type Dfaut Variable // Rcepteur TNT (en fait filtre de capture) en premire position ( cause d'une fonction qui l'utilise via l'index 0) +#if ADVANCED_TUNER_SEARCH + {TEXT("Rcepteur TNT"), cit_STR, CONFIG_VAL(NULL_NAME), CONFIG_STR(nom_receiver)}, + {TEXT("Filtre BDA Tuner"), cit_STR, CONFIG_VAL(NULL_NAME), CONFIG_STR(szPathTuner)}, + {TEXT("Filtre BDA Dmodulateur"), cit_STR, CONFIG_VAL(NULL_NAME), CONFIG_STR(szPathDemod)}, + {TEXT("Filtre BDA Capture"), cit_STR, CONFIG_VAL(NULL_NAME), CONFIG_STR(szPathCapture)}, +#else {TEXT("Rcepteur TNT"), cit_DRV, CONFIG_VAL(NULL_NAME), CONFIG_STR(nom_receiver)}, +#endif // {TEXT("Offset tuner"), cit_INT, 0, & offset_tuner}, {TEXT("Essayer +5 kHz si chec"), cit_BOOL, INI_TRY_ADDING_5KHZ_DEFAULT, & try_adding_5khz}, @@ -1169,7 +1181,7 @@ void PlatformAdjust(LPTSTR pszKey, UINT32 nBufSize); /// Slection d'une nouvelle section base sur un nom de tuner - CConfigFile & NewTunerSection(LPCTSTR pszTunerName); + CConfigFile & NewTunerSection(LPCTSTR pszTunerName, bool bMigrating = false); /** * Sauve un nom de pilote pass en paramtre. @@ -1195,8 +1207,9 @@ /** * Charge les donnes spcifiques au tuner configur + * \param[in] bMigrating Mettre \p true pour rcuprer les donnes d'une ancienne version **/ - void load_tuner_config(); + void load_tuner_config(bool bMigrating); /** * Sauvegarde d'un raccourci @@ -2002,10 +2015,13 @@ strcat_T(pszKey, nBufSize, TEXT(" (debug)")); } -CConfigFile & CConfigFile::NewTunerSection(LPCTSTR pszTunerName) +CConfigFile & CConfigFile::NewTunerSection(LPCTSTR pszTunerName, bool bMigrating) { - TCHAR szWrk[256] = TEXT("Tuner : "); + TCHAR szWrk[256] = TEXT("Tuner"); + if (!bMigrating) + PlatformAdjust(szWrk, _countof(szWrk)); + strcat_T(szWrk, TEXT(" : ")); strcat_T(szWrk, pszTunerName); NewSection(szWrk); return *this; @@ -2514,10 +2530,11 @@ /** * Charge les donnes spcifiques au tuner configur + * \param[in] bMigrating Mettre \p true pour rcuprer les donnes d'une ancienne version **/ -void load_config_tuner() +void load_config_tuner(bool bMigrating) { - CConfigFile().load_tuner_config(); + CConfigFile().load_tuner_config(bMigrating); } /** @@ -2551,13 +2568,14 @@ /** * Charge les donnes spcifiques au tuner configur + * \param[in] bMigrating Mettre \p true pour rcuprer les donnes d'une ancienne version **/ -void CConfigFile::load_tuner_config() +void CConfigFile::load_tuner_config(bool bMigrating) { if (IsNullName(nom_tuner)) return; - NewTunerSection(nom_tuner); + NewTunerSection(nom_tuner, bMigrating); load_items(ini_tuner_items); } @@ -2592,7 +2610,7 @@ cConfig.load_colors(); // Section spcifique au tuner - cConfig.load_tuner_config(); + cConfig.load_tuner_config(false); // Section des raccourcis cConfig.load_raccourcis(); @@ -2641,6 +2659,65 @@ **/ bool check_config(void) { +#if ADVANCED_TUNER_SEARCH + if (!IsNullName(szPathTuner)) { + HRESULT hr; + + // Au moins un chemin tuner a t spcifi. + // Vrifier qu'il correspond bien un tuner valide et prsent + if (!MonikerBindings(szPathTuner, &hr).isOk() || FAILED(hr)) + return false; + + // S'il y a un filtre dmodulateur, il doit tre valide + if (!IsNullName(szPathDemod)) { + if (!MonikerBindings(szPathDemod, &hr).isOk() || FAILED(hr)) + return false; + } + + // S'il y a un filtre de capture, il doit tre valide + if (!IsNullName(szPathCapture)) { + if (!MonikerBindings(szPathCapture, &hr).isOk() || FAILED(hr)) + return false; + } + + return true; // La configuration est valide + } + + if (IsNullName(nom_tuner)) + return false; // La configuration n'est pas valide : on n'a mme pas de nom de tuner + + // La configuration n'est pas valide, mais il existait sans doute une configuration valide + // en relation une ancienne version du logiciel, ce qu'on va vrifier, et le cas chant, + // essayer de convertir silencieusement, partir du seul nom de tuner. + + DeviceInfoList vTunerList; + + CSearchTuner(vTunerList, autre_graphe).Do(); + + // Recherche d'une configuration compatible avec le prcdent nom de tuner sauvegard + for (ITERATE_CONST_VECTOR(vTunerList, DeviceInfo, it)) { + if (it->TunerDisplayName()==nom_tuner) { + // Dans certaines versions, le nom de la section Tuner du fichier config.ini peut + // avoir chang (chane(s) (x64) et/ou (debug) ajoute(s)). + // On rcupre donc ici le paramtrage de la section sous son ancien nom afin de le + // sauvegarder dans la section utilisant le nouveau nom. + load_config_tuner(true); + + // Sauvegarde des nouveaux paramtres de configuration automatiquement dtermins : + strcpy_T(nom_receiver, it->ReceiverDisplayName().c_str()); + strcpy_T(szPathTuner, it->asDev[dt_Tuner].strPath.c_str()); + strcpy_T(szPathDemod, it->asDev[dt_Demod].strPath.c_str()); + strcpy_T(szPathCapture, it->asDev[dt_Capture].strPath.c_str()); + + // Sauvegarde de la configuration ajuste + save_config(); + return true; + } + } + + // Migration impossible : l'utilisateur devra refaire sa configuration + return false; +#else CComPtr pNetworkTuner; CComPtr pReceiverComponent; @@ -2665,6 +2742,7 @@ return false; } } +#endif } /** Modifié: trunk/ini.h =================================================================== --- trunk/ini.h 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/ini.h 2009-12-05 01:55:42 UTC (rev 213) @@ -225,6 +225,11 @@ // Valeurs sauvegardes sparment pour chaque type de tuner : extern TCHAR nom_receiver[256]; //!< Nom du rcepteur utiliser +#if ADVANCED_TUNER_SEARCH +extern TCHAR szPathTuner[256]; //!< "Device Path" du tuner +extern TCHAR szPathDemod[256]; //!< "Device Path" du filtre dmodulateur +extern TCHAR szPathCapture[256]; //!< "Device Path" du filtre de capture +#endif extern int offset_tuner; //!< Offset appliquer toutes les frquences recherches extern bool try_adding_5khz; //!< Essayer d'ajouter 5 kHz si aucun signal trouv // extern bool use_even_frequencies; //!< Alignement sur des frquences paires @@ -448,8 +453,9 @@ /** * Charge les donnes spcifiques au tuner configur + * \param[in] bMigrating Mettre \p true pour rcuprer les donnes d'une ancienne version **/ -void load_config_tuner(); +void load_config_tuner(bool bMigrating); /** * Obtenir le nom de "receiver" associ au nom de tuner fourni Modifié: trunk/main.cpp =================================================================== --- trunk/main.cpp 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/main.cpp 2009-12-05 01:55:42 UTC (rev 213) @@ -3165,7 +3165,9 @@ myprintf( TEXT("Tuner : ") COLR(HYELLOW, TEXT("%s")) EOL +#if ADVANCED_TUNER_SEARCH == 0 TEXT("Rcepteur : ") COLR(HYELLOW, TEXT("%s")) EOL +#endif TEXT("Codec Vido MPEG2 : ") COLR(HCYAN, TEXT("%s")) EOL TEXT("Codec Vido H264 : ") COLR(HCYAN, TEXT("%s")) EOL TEXT("Codec Audio MPEG2 : ") COLR(HGREEN, TEXT("%s")) EOL @@ -3173,7 +3175,9 @@ TEXT("Codec Audio EAC3 : ") COLR(HGREEN, TEXT("%s")) EOL TEXT("Ville : ") COLR(HBLUE, TEXT("%s")) EOL, nom_tuner, +#if ADVANCED_TUNER_SEARCH == 0 nom_receiver, +#endif filtreMPEG2, filtreH264, filtreAudio, Modifié: trunk/parse.cpp =================================================================== --- trunk/parse.cpp 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/parse.cpp 2009-12-05 01:55:42 UTC (rev 213) @@ -631,7 +631,7 @@ Canaux.clear(); } - log(EOL BOLD(TEXT("################################################################")) EOL); + log(EOL TEXT("################################################################") EOL); time(&sTime); if (localtime_s(&sTm, &sTime)==0) { TCHAR szWrk[64]; @@ -645,6 +645,56 @@ CRegControlSet cRegCtlSet; tstring strTunerDevicePath; +#if ADVANCED_TUNER_SEARCH + tstring strDemodDevicePath; + tstring strCaptureDevicePath; + + tstring strTmpName = MonikerBindings(szPathTuner).strName.c_str(); + + cRegCtlSet.GetDevicePath(KSCATEGORY_BDA_NETWORK_TUNER, strTmpName.c_str(), strTunerDevicePath); + log(TEXT("Tuner : %s") EOL, strTmpName.c_str()); + + if (!IsNullName(szPathDemod)) { + strTmpName = MonikerBindings(szPathDemod).strName.c_str(); + cRegCtlSet.GetDevicePath(KSCATEGORY_BDA_RECEIVER_COMPONENT, strTmpName.c_str(), strDemodDevicePath); + log(TEXT("Dmodulateur : %s") EOL, strTmpName.c_str()); + } + + if (!IsNullName(szPathCapture)) { + strTmpName = MonikerBindings(szPathCapture).strName.c_str(); + cRegCtlSet.GetDevicePath(KSCATEGORY_BDA_RECEIVER_COMPONENT, strTmpName.c_str(), strCaptureDevicePath); + log(TEXT("Capture : %s") EOL, strTmpName.c_str()); + } + + if (!strCaptureDevicePath.empty()) { + if (!strDemodDevicePath.empty()) { + if (strTunerDevicePath == strDemodDevicePath) { + if (strDemodDevicePath == strCaptureDevicePath) + logDeviceInfo(TEXT("tuner & dmodulateur & capture"), strTunerDevicePath.c_str()); + else { + logDeviceInfo(TEXT("tuner & dmodulateur"), strTunerDevicePath.c_str()); + logDeviceInfo(TEXT("capture"), strCaptureDevicePath.c_str()); + } + } else { + logDeviceInfo(TEXT("tuner"), szPathTuner); + if (strDemodDevicePath == strCaptureDevicePath) + logDeviceInfo(TEXT("dmodulateur & capture"), strDemodDevicePath.c_str()); + else { + logDeviceInfo(TEXT("dmodulateur"), strDemodDevicePath.c_str()); + logDeviceInfo(TEXT("capture"), strCaptureDevicePath.c_str()); + } + } + } else { + if (strTunerDevicePath == strCaptureDevicePath) + logDeviceInfo(TEXT("tuner & capture"), strTunerDevicePath.c_str()); + else { + logDeviceInfo(TEXT("tuner"), strTunerDevicePath.c_str()); + logDeviceInfo(TEXT("capture"), strCaptureDevicePath.c_str()); + } + } + } else + logDeviceInfo(TEXT("tuner"), strTunerDevicePath.c_str()); +#else // #if ADVANCED_TUNER_SEARCH tstring strReceiverDevicePath; cRegCtlSet.GetDevicePath(KSCATEGORY_BDA_NETWORK_TUNER, nom_tuner, strTunerDevicePath); @@ -663,6 +713,7 @@ logDeviceInfo(TEXT("rcepteur"), strReceiverDevicePath.c_str()); } } +#endif // #if ADVANCED_TUNER_SEARCH log(EOL TEXT("Options :") EOL TEXT(" -- Ignorer prsence du signal = %s") EOL Modifié: trunk/res.rc =================================================================== --- trunk/res.rc 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/res.rc 2009-12-05 01:55:42 UTC (rev 213) @@ -76,7 +76,7 @@ MENUITEM "C&odec vido H264", IDM_H264 MENUITEM "Codec a&udio MPEG2", IDM_MP2A MENUITEM "Codec audio &AC3", IDM_AC3 - MENUITEM "Codec audio &EAC3", IDM_EAC3 + MENUITEM "Codec audio &EAC3", IDM_EAC3 MENUITEM SEPARATOR MENUITEM "&Rendu vido", IDM_VMR MENUITEM "Rendu &audio", IDM_DSOUND @@ -148,8 +148,9 @@ GROUPBOX "quipement de rception TV",IDC_STATIC,7,3,276,68 LTEXT "Tuner TNT",IDC_STATIC,14,15,55,12,SS_CENTERIMAGE COMBOBOX IDC_COMBO_TUNER,76,15,200,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Rcepteur TNT",IDC_STATIC,16,33,55,12,SS_CENTERIMAGE - COMBOBOX IDC_COMBO_RECEIVER,76,33,200,100,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Rcepteur TNT",IDC_COMBO_RECEIVER_S,16,33,55,12,SS_CENTERIMAGE | NOT WS_VISIBLE + COMBOBOX IDC_COMBO_RECEIVER,76,33,200,100,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + RTEXT "(note: le composant rcepteur qui tait spcifi dans les versions prcdentes est maintenant dtermin automatiquement)",IDC_INFO_RECEIVER,64,31,210,16 CONTROL "Mode alternatif (pour les tuners qui ne fonctionnent qu'avec les versions prcdentes du programme)",IDC_ALT_GRAPH, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,16,50,258,16 GROUPBOX "Codecs vido",IDC_STATIC,7,75,276,46 Modifié: trunk/resource.h =================================================================== --- trunk/resource.h 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/resource.h 2009-12-05 01:55:42 UTC (rev 213) @@ -30,8 +30,9 @@ #define IDD_SCAN_FREQS 136 #define IDC_DONTSHOWAGAIN 1000 + #define IDC_COMBO_TUNER 1001 -#define IDC_COMBO_RECEIVER 1002 +#define IDC_INFO_RECEIVER 1002 #define IDC_COMBO_MPEG2 1003 #define IDC_COMBO_H264 1004 #define IDC_COMBO_AUDIO 1005 @@ -168,6 +169,9 @@ #define IDC_OSD_COLOR 1183 #define IDC_MSN 1184 +#define IDC_COMBO_RECEIVER_S 1188 // Item temporaire +#define IDC_COMBO_RECEIVER 1189 // Item temporairement maintenu + #define MY_TRAY_ICON_ID 20001 #define IDM_CHAINES_BASE 39000 // Offset de base pour changement chane @@ -251,7 +255,7 @@ #define IDM_DEBRANCHE 40095 // debug // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 137 Modifié: trunk/search.cpp =================================================================== --- trunk/search.cpp 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/search.cpp 2009-12-05 01:55:42 UTC (rev 213) @@ -30,6 +30,58 @@ #include "search.h" // ==================================================================================== +// Descripteur de configuration tuner +// ==================================================================================== + +#if ADVANCED_TUNER_SEARCH + +bool DeviceFilterInfo::Valid() const +{ + return + ! IsNullName(strName.c_str()) && + ! IsNullName(strPath.c_str()); +} + +/// Ajout d'un rsultat valide +void DeviceFilterInfo::Set(LPCTSTR pszName, LPCTSTR pszPath) +{ + strName = pszName; + + // Si des espaces existent en fin de la chane "device path" (ce qui est vaguement + // un bug de driver de certains tuners, cf par exemple Hauppauge WinTV-NOVA-T-500 version + // driver 4.3.27240.0), ceux-ci DOIVENT tre prservs. La lecture du fichier + // "config.ini" les liminant automatiquement, il convient donc d'encadrer la chane + // avec des crochets (les guillemets ne sont pas adquats, car ils sont aussi limins) + // qui devront tre retirs plus tard. + strPath = TEXT("["); + strPath += pszPath; + strPath += TEXT("]"); +} + +/// Comparaison pour tri +bool DeviceInfo::operator < (const DeviceInfo & s2) const +{ + if (asDev[dt_Tuner].strName == s2.asDev[dt_Tuner].strName) + return nDevCount < s2.nDevCount; + return asDev[dt_Tuner].strName < s2.asDev[dt_Tuner].strName; +} + +void DeviceInfoList::FindDuplicates() +{ + for (ITERATE_VECTOR(*this, DeviceInfo, it1)) { + for (iterator it2 = it1+1; it2 != end(); it2++) { + if (it1->asDev[dt_Tuner].strName == it2->asDev[dt_Tuner].strName) { + // Doublon trouv : lui donner le numro du prcdent + 1 et passer au suivant + it2->nDevCount = it1->nDevCount + 1; + break; + } + } + } +} + +#endif // #if ADVANCED_TUNER_SEARCH + +// ==================================================================================== // Recherche de codecs // ==================================================================================== @@ -92,6 +144,8 @@ // Recherche de filtres BDA // ==================================================================================== +#if ADVANCED_TUNER_SEARCH == 0 + CompatResult filtre_compat(CComPtr & pFilter) { CompatResult eCompat = compat_None; @@ -134,6 +188,8 @@ return eCompat; } +#endif // #if ADVANCED_TUNER_SEARCH == 0 + CSearchByCategory::CSearchByCategory(CLSID clsid) : hr(E_FAIL) { @@ -194,8 +250,168 @@ return hr; } +// ==================================================================================== +// Recherche de rcepteur avance +// ==================================================================================== +#if ADVANCED_TUNER_SEARCH + +/** + * Constructeur : prpare l'numration pour la recherche d'un filtre rcepteur + * associer un tuner donn. + * \param[in] pTstGraph Graphe dj construit jusqu'au tuner. + * \param[in] bFrst \p true au 1er niveau de profondeur, \p false au second + * \param[in,out] vRslt Donnes tuner complter. + **/ +CSearchTuner::CSearchReceiver::CSearchReceiver(IPTvM_TunerGraph * pTstGraph, bool bFrst, DeviceInfo & vRslt) : + CSearchByCategory(KSCATEGORY_BDA_RECEIVER_COMPONENT), + vResult(vRslt), + pTestGraph(pTstGraph), + bFirst(bFrst) +{ +} + +/** + * Implmentation de mthode virtuelle appele pour chaque filtre trouv. + * \param[in] cMnkb Structure contenant les informations de recherche + * \return \p S_OK car tous les filtres doivent tre numrs + **/ +HRESULT CSearchTuner::CSearchReceiver::ApplyOne(MonikerBindings & cMnkb) +{ + HRESULT hr; // Pour les codes d'erreur qu'on compte ne pas retourner + tstring strPath; + + hr = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" + if (FAILED(hr)) + return S_OK; // Invalide : S_OK pour continuer chercher + + // Tenter d'ajouter le filtre au graphe + hr = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); + if (FAILED(hr)) + return S_OK; // Invalide : S_OK pour continuer chercher + + DeviceType eDevType = dt_Capture; // dt_Capture par dfaut + + if (bFirst) { + // Premier filtre rcepteur trouv : rechercher s'il n'y en a pas un second + hr = CSearchReceiver(pTestGraph, false, vResult).Do(); + + // Si un filtre de capture a t trouv en 3me position, alors celui-ci est un filtre + // dmodulateur + if (vResult.asDev[dt_Capture].Valid()) + eDevType = dt_Demod; + } + + // Ajout du filtre la position qui lui a t assigne + vResult.asDev[eDevType].Set(cMnkb.strName.c_str(), strPath.c_str()); + + // Retirer le filtre + hr = pTestGraph->PopFilter(); + myprintf(CMyP ERRX(TEXT("chec dpilage du filtre rcepteur pendant la recherche, hr=0x%08x")), FAILED(hr), hr); + + // Retour avec S_FALSE pour indiquer qu'on arrte de chercher + return S_FALSE; +} + +#endif + // ==================================================================================== +// Recherche de tuner avance +// ==================================================================================== + +#if ADVANCED_TUNER_SEARCH + +/** + * Constructeur : prpare l'numration pour le remplissage d'une + * liste droulante avec une liste de filtres tuner. + * \param[out] vRslts Tableau de rsultats remplir. + * \param[in] bLegacy \p true si ancien graphe utiliser. + **/ +CSearchTuner::CSearchTuner(DeviceInfoList & vRslts, bool bLegacy) : + CSearchByCategory(KSCATEGORY_BDA_NETWORK_TUNER), + vResults(vRslts), + pTestGraph(new_TunerGraph(bLegacy)) +{ + if (pTestGraph.get()) + hr = pTestGraph->Build(); +} + + +/** + * Implmentation de mthode virtuelle appele pour chaque filtre trouv. + * \param[in] cMnkb Structure contenant les informations de recherche + * \return \p S_OK car tous les filtres doivent tre numrs + **/ +HRESULT CSearchTuner::ApplyOne(MonikerBindings & cMnkb) +{ + if (!pTestGraph.get()) + return S_FALSE; // Pas de graphe + + if (FAILED(hr)) + return hr; // Erreur la construction + + HRESULT hr; // Pour les codes d'erreur qu'on compte ne pas retourner + + #if USE_TUNING_SPACE + // Envoi d'un "tune request" (sauf si graphe alternatif, dans lequel + // cette fonctionnalit n'est pas exploitable ce stade) + if (!pTestGraph->isLegacyGraph()) { + hr = pTestGraph->change_frequence(-1, -1); + if (FAILED(hr)) + return hr; + } + #endif + + tstring strPath; + + hr = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" + if (FAILED(hr)) + return S_OK; // Invalide : S_OK pour continuer chercher + + // Tenter d'ajouter le filtre au graphe + hr = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); + if (FAILED(hr)) + return S_OK; // chec : on retourne nanmoins avec S_OK (pour continuer chercher) + + // Construction du rsultat + DeviceInfo sInf; + + sInf.asDev[dt_Tuner].Set(cMnkb.strName.c_str(), strPath.c_str()); + + // Chercher les filtres matriels supplmentaires qui pourraient tre requis + hr = CSearchReceiver(pTestGraph.get(), dt_Demod, sInf).Do(); + + // Retirer le filtre tuner + HRESULT hr2 = pTestGraph->PopFilter(); + + myprintf(CMyP ERRX(TEXT("chec dpilage du filtre tuner pendant la recherche, hr=0x%08x")), FAILED(hr2), hr2); + + // Ajouter le rsultat l'ensembles des rsultats de la liste + if (SUCCEEDED(hr)) + vResults.push_back(sInf); + + return S_OK; +} + +/** + * Application de la mthode virtuelle \p ApplyOne chaque filtre trouv. + * \return Code d'erreur DirectShow + **/ +HRESULT CSearchTuner::Do() +{ + HRESULT hr = __super::Do(); + + // Recherche et marquage des filtres qui auraient des noms de tuners identiques + vResults.FindDuplicates(); + + // Tri de la liste + sort(vResults.begin(), vResults.end()); + return hr; +} + +#endif + +// ==================================================================================== // Recherche d'informations dans la base de registre // ==================================================================================== Modifié: trunk/search.h =================================================================== --- trunk/search.h 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/search.h 2009-12-05 01:55:42 UTC (rev 213) @@ -28,7 +28,11 @@ #pragma once -#include "filters.h" +#if ADVANCED_TUNER_SEARCH + #include "graph.h" +#else + #include "filters.h" +#endif // ==================================================================================== // Recherche de codecs @@ -158,6 +162,7 @@ // Recherche de filtres BDA // ==================================================================================== +#if ADVANCED_TUNER_SEARCH == 0 /** * Listes des valeurs retournes par \p filtre_compat **/ @@ -177,6 +182,8 @@ **/ CompatResult filtre_compat(CComPtr & pFilter); +#endif // #if ADVANCED_TUNER_SEARCH == 0 + /** * Classe d'assistance l'numration des filtres dans une catgorie donne. **/ @@ -222,6 +229,8 @@ HRESULT Do(); }; +#if ADVANCED_TUNER_SEARCH == 0 + /** * Classe d'assistance au remplissage d'un tableau de chanes de caractres * avec une liste de filtres disponibles. @@ -256,6 +265,8 @@ } }; +#endif // #if ADVANCED_TUNER_SEARCH == 0 + /** * Classe d'assistance la recherche d'un filtre partir de son nom, dans une catgorie donne. */ @@ -303,6 +314,144 @@ }; // ==================================================================================== +// Recherche de tuner avance +// ==================================================================================== + +#if ADVANCED_TUNER_SEARCH + +/** + * Types de filtres pouvant composer le tuner. + * When enum'ing the device filters in BDACardCollection look for two KSCATEGORY_BDA_RECEIVER_COMPONENT + * filters that will connect in sequence. If you only find one then you need mark the demodDevice as null. + * And obviously flow all this through to the graph building code + * Voir http://forums.dvbowners.com/index.php?showtopic=2302 + **/ +enum DeviceType { + dt_Null = -1, + dt_Tuner, //!< KSCATEGORY_BDA_NETWORK_TUNER => Tuner + dt_Demod, //!< KSCATEGORY_BDA_RECEIVER_COMPONENT => Dmodulateur (optionnel) + dt_Capture, //!< KSCATEGORY_BDA_RECEIVER_COMPONENT => Capture + dt_END //!< Fictif (nombre d'lments) +}; + +struct DeviceFilterInfo +{ + tstring strName; //!< Nom du filtre + tstring strPath; + + DeviceFilterInfo() : + strName(NULL_NAME), + strPath(NULL_NAME) + { + } + + DeviceFilterInfo & operator = (const DeviceFilterInfo & sSrc) { + strName = sSrc.strName; + strPath = sSrc.strPath; + return *this;} + + /// Ajout d'un rsultat valide + void Set(LPCTSTR pszName, LPCTSTR pszPath); + + /** + * Gnration du nom du priphrique, avec numro d'ordre optionnel + * \param[in] nDevCount Numro d'ordre ajout la fin si > 1 + * return Nom du priphrique gnr pour affichage + **/ + tstring DisplayName(int nDevCount) const { + if (nDevCount > 1) + return tstr_printf(TEXT("%s #%u"), strName.c_str(), nDevCount); + return strName; } + + bool Valid() const; +}; + + +struct DeviceInfo +{ + int nDevCount; //!< N d'instance du nom tuner (si plusieurs tuners de mme nom) + DeviceFilterInfo asDev[dt_END]; + + DeviceInfo() : + nDevCount(1) + {} + + /// Test validit de la dfinition (au moins un filtre tuner et un filtre de capture) + bool Valid() const { + return asDev[dt_Tuner].Valid() && asDev[dt_Capture].Valid(); } + + /// Comparaison pour tri + bool operator < (const DeviceInfo & s2) const; + + /// Obtenir le nom du tuner pour affichage (avec numro ajout si plusieurs tuners de mme nom) + tstring TunerDisplayName() const { + return asDev[dt_Tuner].DisplayName(nDevCount); } + + /// Obtenir le nom du rcepteur pour affichage (avec numro ajout si plusieurs tuners de mme nom) + tstring ReceiverDisplayName() const { + return asDev[dt_Capture].DisplayName(nDevCount); } +}; + +class DeviceInfoList : public vector +{ +public: + void FindDuplicates(); +}; + +class CSearchTuner : public CSearchByCategory +{ + DeviceInfoList & vResults; + auto_ptr pTestGraph; + + class CSearchReceiver : public CSearchByCategory + { + DeviceInfo & vResult; + IPTvM_TunerGraph * pTestGraph; + bool bFirst; + public: + /** + * Constructeur : prpare l'numration pour la recherche d'un filtre rcepteur + * associer un tuner donn. + * \param[in] pTstGraph Graphe dj construit jusqu'au tuner. + * \param[in] bFrst \p true au 1er niveau de profondeur, \p false au second + * \param[in,out] vRslt Donnes tuner complter. + **/ + CSearchReceiver(IPTvM_TunerGraph * pTstGraph, bool bFrst, DeviceInfo & vRslt); + + /** + * Implmentation de mthode virtuelle appele pour chaque filtre trouv. + * \param[in] cMnkb Structure contenant les informations de recherche + * \return \p S_OK car tous les filtres doivent tre numrs + **/ + virtual HRESULT ApplyOne(MonikerBindings & cMnkb); + }; + +public: + /** + * Constructeur : prpare l'numration pour le remplissage d'une + * liste droulante avec une liste de filtres tuner. + * \param[out] vRslts Tableau de rsultats remplir. + * \param[in] bLegacy \p true si ancien graphe utiliser. + **/ + CSearchTuner(DeviceInfoList & vRslts, bool bLegacy); + + /** + * Implmentation de mthode virtuelle appele pour chaque filtre trouv. + * \param[in] cMnkb Structure contenant les informations de recherche + * \return \p S_OK car tous les filtres doivent tre numrs + **/ + virtual HRESULT ApplyOne(MonikerBindings & cMnkb); + + /** + * Application de la mthode virtuelle \p ApplyOne chaque filtre trouv. + * \return Code d'erreur DirectShow + **/ + HRESULT Do(); +}; + +#endif // #if ADVANCED_TUNER_SEARCH + +// ==================================================================================== // Recherche d'informations dans la base de registre // ==================================================================================== Modifié: trunk/settings.cpp =================================================================== --- trunk/settings.cpp 2009-12-04 20:37:24 UTC (rev 212) +++ trunk/settings.cpp 2009-12-05 01:55:42 UTC (rev 213) @@ -1371,11 +1371,42 @@ return select_combo_name(hItm, nom); } +#if ADVANCED_TUNER_SEARCH + /** * Remplit la liste droulante contenant les tuners, et y slectionne le tuner * prcdemment dfini. Si celui-ci n'existe plus, il est ajout la liste et * slectionn, mais la fonction retourne \p false. * + * \param[in] hItm handle de la liste droulante dans la boite de dialogue + * \param[out] vTunerList Liste de tuners dtects avec informations associes + * \param[in] nom nom du tuner prcdement slectionn + * \param[in] bLegacy \p true si ancien graphe utiliser. + **/ +static bool remplit_combo_tuner(HWND hItm, DeviceInfoList & vTunerList, LPCTSTR nom, bool bLegacy) +{ + // Remplissage de la table des tuners disponibles + vTunerList.clear(); // Nettoyage de tout contenu antrieur (prcaution) + CSearchTuner(vTunerList, bLegacy).Do(); + + // Rinitialisation de la combo box + SendMessage(hItm, CB_RESETCONTENT, 0, NULL); + + // Ajout des items tris, dans la combo box + for (ITERATE_CONST_VECTOR(vTunerList, DeviceInfo, it)) + SendMessage(hItm, CB_ADDSTRING, 0, reinterpret_cast(it->TunerDisplayName().c_str())); + + // Slection du nom du tuner + return select_combo_name(hItm, nom_tuner); +} + +#else + +/** + * Remplit la liste droulante contenant les tuners, et y slectionne le tuner + * prcdemment dfini. Si celui-ci n'existe plus, il est ajout la liste et + * slectionn, mais la fonction retourne \p false. + * * \param[in] hItm handle de la liste droulante dans la boite de dialogue * \param[in] guid \p GUID permettant d'effectuer la recherche des tuners installs * \param[in] nom nom du tuner prcdement slectionn @@ -1384,13 +1415,15 @@ **/ static bool remplit_combo_tuner(HWND hItm, GUID guid, LPCTSTR nom) { - vector vStrFiltres; + vector vStrFiltres; CSearchByCategory_FillVector(guid, vStrFiltres).Do(); return vectorstr_to_combo(vStrFiltres, hItm, nom); } +#endif // #if ADVANCED_TUNER_SEARCH == 0 + /** * Remplit la liste droulante contenant les filtres, et y slectionne le filtre * prcdemment dfini. Si celui-ci n'existe plus, il est ajout la liste et @@ -1400,7 +1433,7 @@ * \param[in] type \p GUID permettant d'effectuer la recherche des filtres installs (AUDIO, VIDEO, etc.) * \param[in] subtype \p GUID permettant d'affiner la recherche (MPRG2_AUDIO, AC3, etc.) * \param[in] nom nom du filtre prcdement slectionn - * \retval false si le prcdent tuner n'a pas pu tre trouv + * \retval false si le prcdent tuner n'a pas pu tre trouv * \return la position dans la liste droulante **/ static bool remplit_combo_filtre(HWND hItm, GUID type, GUID subtype, LPCTSTR nom) @@ -1412,16 +1445,43 @@ return vectorstr_to_combo(vStrFiltres, hItm, nom); } +#if ADVANCED_TUNER_SEARCH /** * Met jour les diffrents paramtres des drivers, et dtermine si il y a eu une modification ou pas * + * \param[in] hDlg handle de la bote de dialogue + * \param[in] vTunerList Liste de configurations de tuners + * \retval true un lment a t modifi + * \retval false aucune modification + **/ +bool drivers_apply(HWND hDlg, const DeviceInfoList & vTunerList) +#else +/** + * Met jour les diffrents paramtres des drivers, et dtermine si il y a eu une modification ou pas + * * \param[in] hDlg handle de la bote de dialogue * \retval true un lment a t modifi * \retval false aucune modification **/ bool drivers_apply(HWND hDlg) +#endif { bool changed = false; +#if ADVANCED_TUNER_SEARCH + INT nIdx = (INT)SendMessage(GetDlgItem(hDlg, IDC_COMBO_TUNER), CB_GETCURSEL, 0, 0); + + if (nIdx >= 0 && nIdx < (INT)vTunerList.size()) { + const DeviceInfo & sNewTunerConf = vTunerList[nIdx]; + tstring strNewTuner = sNewTunerConf.TunerDisplayName(); + + changed = copy_check(nom_tuner, _countof(nom_tuner), strNewTuner.c_str()); + changed |= copy_check(nom_receiver, _countof(nom_receiver), sNewTunerConf.ReceiverDisplayName().c_str()); + changed |= copy_check(szPathTuner, _countof(szPathTuner), sNewTunerConf.asDev[dt_Tuner].strPath.c_str()); + changed |= copy_check(szPathDemod, _countof(szPathDemod), sNewTunerConf.asDev[dt_Demod].strPath.c_str()); + changed |= copy_check(szPathCapture, _countof(szPathCapture), sNewTunerConf.asDev[dt_Capture].strPath.c_str()); + } + +#else // Est-ce qu'il y a eu une modification ? changed = extrait_combo(GetDlgItem(hDlg, IDC_COMBO_TUNER), nom_tuner, _countof(nom_tuner), false); @@ -1429,10 +1489,13 @@ // (avant de rcuprer le rcepteur, dont le nom avait dj t copi dans la liste // droulante, et qui pourrait avoir t chang juste aprs) if (changed) - load_config_tuner(); + load_config_tuner(false); +#endif // Vrifie si des paramtres ont t changs, et rcupre les nouvelles versions +#if ADVANCED_TUNER_SEARCH == 0 changed |= extrait_combo(GetDlgItem(hDlg, IDC_COMBO_RECEIVER), nom_receiver, _countof(nom_receiver), false); +#endif if (get_check(hDlg, IDC_ALT_GRAPH)!=autre_graphe) { autre_graphe = !autre_graphe; changed = true; @@ -1446,14 +1509,18 @@ myprintf( TEXT("Nouvelle configuration :") EOL TEXT("Tuner : %s") EOL +#if ADVANCED_TUNER_SEARCH == 0 TEXT("Receiver : %s") EOL +#endif TEXT("Video : %s") EOL TEXT("- H264 : %s") EOL TEXT("Audio : %s") EOL TEXT("- Ac3 : %s") EOL TEXT("- Eac3 : %s") EOL, nom_tuner, +#if ADVANCED_TUNER_SEARCH == 0 nom_receiver, +#endif filtreMPEG2, filtreH264, filtreAudio, filtreAc3, filtreEac3); @@ -1480,6 +1547,9 @@ **/ static INT_PTR CALLBACK DriversDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { +#if ADVANCED_TUNER_SEARCH + static DeviceInfoList vTunerList; +#endif TCHAR szWrk[256]; // Variable de travail switch (uMsg) { @@ -1494,7 +1564,14 @@ } HWND hTuner = GetDlgItem(hDlg, IDC_COMBO_TUNER); +#if ADVANCED_TUNER_SEARCH == 0 HWND hReceiver = GetDlgItem(hDlg, IDC_COMBO_RECEIVER); + + // Rendre visible des items maintenus cachs, pour prserver l'ancienne configuration + ShowWindow(hReceiver, SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDC_COMBO_RECEIVER_S), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDC_INFO_RECEIVER), SW_HIDE); +#endif HWND hMpeg2 = GetDlgItem(hDlg, IDC_COMBO_MPEG2); HWND hH264 = GetDlgItem(hDlg, IDC_COMBO_H264); HWND hAudio = GetDlgItem(hDlg, IDC_COMBO_AUDIO); @@ -1506,10 +1583,16 @@ // sur l'ordinateur : tstring strListeAbsents; +#if ADVANCED_TUNER_SEARCH + // Remplissage de la table des tuners disponibles + if (!remplit_combo_tuner(hTuner, vTunerList, nom_tuner, autre_graphe)) + strListeAbsents = tstr_printf(EOL TEXT("- %s"), nom_tuner); +#else if (!remplit_combo_tuner(hTuner, KSCATEGORY_BDA_NETWORK_TUNER, nom_tuner)) strListeAbsents = tstr_printf(EOL TEXT("- %s"), nom_tuner); if (!remplit_combo_tuner(hReceiver, KSCATEGORY_BDA_RECEIVER_COMPONENT, nom_receiver)) strListeAbsents += tstr_printf(EOL TEXT("- %s"), nom_receiver); +#endif if (!remplit_combo_filtre(hMpeg2, MEDIATYPE_Video, MEDIASUBTYPE_MPEG2_VIDEO, filtreMPEG2)) strListeAbsents += tstr_printf(EOL TEXT("- %s"), filtreMPEG2); if (!remplit_combo_filtre(hH264, MEDIATYPE_Video, MEDIASUBTYPE_H264, filtreH264)) @@ -1524,7 +1607,9 @@ // Cherche s'il n'y a qu'un lment dans la liste // Le slectionne si oui selectionne_si_solo(hTuner); +#if ADVANCED_TUNER_SEARCH == 0 selectionne_si_solo(hReceiver); +#endif selectionne_si_solo(hMpeg2); selectionne_si_solo(hH264); selectionne_si_solo(hAudio); @@ -1546,6 +1631,7 @@ // Changement dans un combo case _cmd_(IDC_COMBO_TUNER, CBN_SELCHANGE): +#if ADVANCED_TUNER_SEARCH == 0 // Nom de tuner chang : changer celui du rcepteur, en corrlation extrait_combo(GetDlgItem(hDlg, IDC_COMBO_TUNER), szWrk, _countof(szWrk), false); if (!IsNullName(szWrk)) { @@ -1554,6 +1640,7 @@ } // ... (passage travers) case _cmd_(IDC_COMBO_RECEIVER, CBN_SELCHANGE): +#endif case _cmd_(IDC_COMBO_MPEG2, CBN_SELCHANGE): case _cmd_(IDC_COMBO_H264, CBN_SELCHANGE): case _cmd_(IDC_COMBO_AUDIO, CBN_SELCHANGE): @@ -1562,6 +1649,12 @@ break; case _cmd_(IDC_ALT_GRAPH, BN_CLICKED): +#if ADVANCED_TUNER_SEARCH + // Reconstruction de la liste des tuners (celle-ci pouvant diffrer si le type + // de graphe est chang) + remplit_combo_tuner(GetDlgItem(hDlg, IDC_COMBO_TUNER), vTunerList, + nom_tuner, get_check(hDlg, IDC_ALT_GRAPH)!=0); +#endif PropSheet_Changed(GetParent(hDlg), hDlg); break; @@ -1569,10 +1662,17 @@ // ne fait PAS partie d'une feuille de proprits : case _cmd_(IDOK, BN_CLICKED): // sauvegarder le changement +#if ADVANCED_TUNER_SEARCH + drivers_apply(hDlg, vTunerList); +#else drivers_apply(hDlg); +#endif // ... (passage travers) case _cmd_(IDCANCEL, BN_CLICKED): +#if ADVANCED_TUNER_SEARCH + vTunerList.clear(); // On n'a plus besoin de la liste des tuners +#endif EndDialog(hDlg, LOWORD(wParam)); return TRUE; } @@ -1594,11 +1694,21 @@ return psn_result(hDlg, PSNRET_NOERROR); case PSN_APPLY: // Application des changements +#if ADVANCED_TUNER_SEARCH + if (drivers_apply(hDlg, vTunerList)) { +#else if (drivers_apply(hDlg)) { +#endif save_config_tuner(); eNeedRestart = nr_Partial; } return psn_result(hDlg, PSNRET_NOERROR); + +#if ADVANCED_TUNER_SEARCH + case PSN_RESET: // Destruction de la page de proprits + vTunerList.clear(); // On n'a plus besoin de la liste des tuners + return FALSE; +#endif } return FALSE; From pouchintv-dev at baysse.fr Fri Dec 18 12:48:11 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Fri, 18 Dec 2009 11:48:11 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r214 - in trunk: . tools tools/GeneRealVersion Message-ID: <20091218114747.6BEE35F766@mail.baysse.fr> Author: gingko Date: 2009-12-18 12:47:45 +0100 (ven 18 déc 2009) New Revision: 214 Modified: trunk/base.h trunk/changelog.html trunk/channels.cpp trunk/channels.h trunk/chanutils.cpp trunk/chanutils.h trunk/epg.cpp trunk/epg.h trunk/graph.cpp trunk/ini.cpp trunk/ini.h trunk/main.cpp trunk/mpeg2defs.h trunk/parse.cpp trunk/record.cpp trunk/record.h trunk/recprog.cpp trunk/recprog.h trunk/rendering.h trunk/res.rc trunk/resource.h trunk/settings.cpp trunk/tools/GeneRealVersion.exe trunk/tools/GeneRealVersion/GeneRealVersion_2005.vcproj trunk/tools/GeneRealVersion/GeneRealVersion_2008.vcproj trunk/tools/GeneRealVersion/main.c Log: Détection des pistes "Home Cinéma", amélioration des choix audio, correction de bugs. chanutils.h, chanutils.cpp, channels.cpp, settings.cpp, ini.h, ini.cpp, recprog.h, recprog.cpp : * Remplacement du paramètre de configuration "Utiliser AC3 par défaut" par une liste déroulante présentant sept choix possibles. * Unification de ce choix de préférences avec celui présenté dans les enregistrements programmés, effectués directement ou bien via l'EPG : les sept choix disponibles sont donc répercutés dans les dialogues correspondants. * Noter que l'ancien paramètre "Utiliser AC3 par défaut" n'est pas migré. Les utilisateurs devront refaire leur sélection après mise à jour. main.cpp, res.rc : * Les titres de menus "Stopper l'enregistrement" et dérivés sont remplacés par "Arrêter l'enregistrement", etc (l'ancien libellé étant trop anglicisé, et de plus, un certain nombre d'utilisateurs tendaient à interpréter "Stopper l'enregistrement dans..." comme quelque chose genre "Sauver l'enregistrement dans..." et ne visitaient alors pas ce dialogue, générant des questions superflues dans le forum). channels.cpp, parse.cpp, graph.cpp, main.cpp : * Ajout d'une détection des pistes AC3 et EAC3 "Home Cinéma" (c'est-à-dire celles qui définissent plus de deux canaux audio). * Correction d'un bug dans Chaine::timeBeforeNextEvent, qui faisait que les "tooltips" de noms d'émissions en cours dans la zone de notification n'étaient pas toujours mis à jour correctement mpeg2defs.h : * Ajout d'items manquant dans l'énumération "MDescriptorTag", ainsi que de méthodes de décodage supplémentaires concernant les descripteurs AC3 et EAC3 (nécessaires pour la détection des pistes HC). parse.cpp : * Correction d'une régression (remontant à la révision 175 !) qui faisait que les langues des pistes audio MPEG2 n'étaient plus récupérées, ni affichées dans le menu des pistes. * Correction d'une erreur dans la détection des pistes de sous-titres et de télétexte (détection pour le moment inexploitée, sauf dans les logs de recherche des chaînes), qui faisait que si le descripteur correspondant était suivi d'un descripteur inconnu, le résultat était marqué "inconnu". rendering.h : * La subdivision des items OSD du bas se fait maintenant dans la proportion 1/3 à gauche, 2/3 à droite, les noms des pistes audio pouvant ne pas tenir dans la moitié de l'écran. recprog.cpp : * Correction d'un bug : la programmation d'un enregistrement depuis l'EPG pouvait faire planter l'application si le nom de l'émission était trop long. Ce sera dorénavant tronqué, dans ce cas (je n'ai pas rallongé le champ, car il m'a quand même semblé approprié de limiter la longueur de ce nom, puisqu'il sera inclus dans le nom du fichier généré). record.cpp, recprog.cpp : * Correction de la mise à jour dans les enregistrements programmés (un enregistrement devenant "supplanté" pouvait ne pas être mis à jour en temps réel). res.rc, resource.h: * Ajout de titres à certains contrôles des dialogues d'enregistrements programmés ainsi que dans l'EPG, et redimensionnement de certains items / dialogues. * Le contrôle de choix de chaînes dans le dialogue d'arrêt d'enregistrement est maintenant référencé sous l'identifiant IDC_CHANNEL, et non plus IDC_RECORD. channels.h, channels.cpp : * Utilisation de la méthode STL "std::sort" pour trier les chaînes, ce qui implique l'ajout de méthodes de comparaison normalisées à la classe "Chaine". GeneRealVersion : * Les versions modifiées par rapport au SVN, dans la future numérotation, seront suffixées d'un "+" et non plus d'un "M". * Les fichiers "pdb" ne sont plus générés en compilation "Release" Modifié: trunk/base.h =================================================================== --- trunk/base.h 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/base.h 2009-12-18 11:47:45 UTC (rev 214) @@ -144,7 +144,8 @@ // Macros utilitaires pour amliorer la lisibilit du code : #define _cmd_ MAKEWPARAM -#define _ncode_(lParam) LPNMHDR(lParam)->code +#define _ncode_(lParam) reinterpret_cast(lParam)->code +#define _nidfr_(lParam) reinterpret_cast(lParam)->idFrom /** * Couleur de fond de la fentre, remplace par l'image Modifié: trunk/changelog.html =================================================================== --- trunk/changelog.html 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/changelog.html 2009-12-18 11:47:45 UTC (rev 214) @@ -56,6 +56,32 @@

        Changements réalisés pour la version 0.5

        +
        SVN rév. 214 :
        +
          +
        • Remplacement du paramètre de configuration Utiliser AC3 par défaut par une liste + déroulante présentant sept choix possibles.
        • +
        • Unification de ce choix de préférences avec celui présenté dans les enregistrements + programmés, effectués directement ou bien via l'EPG.
        • +
        • Les titres de menus Stopper l'enregistrement et dérivés sont remplacés par + Arrêter l'enregistrement, etc.
        • +
        • Ajout d'une détection des pistes AC3 et EAC3 Home Cinéma (c'est-à-dire celles qui + définissent plus de deux canaux audio).
        • +
        • La subdivision des items OSD du bas se fait maintenant dans la proportion 1/3 à gauche, + 2/3 à droite, les noms des pistes audio pouvant ne pas tenir dans la moitié de l'écran.
        • +
        • Corrections de bugs :
            +
          • Les tooltips de noms d'émissions en cours dans la zone de notification n'étaient + pas toujours mis à jour correctement.
          • +
          • La programmation d'un enregistrement depuis l'EPG pouvait faire planter l'application + si le nom de l'émission était trop long.
          • +
          • Les langues des pistes audio MPEG2 n'étaient plus récupérées, ni affichées dans le menu + des pistes (régression remontant à la révision 175).
          • +
          • Un enregistrement devenant supplanté pouvait ne pas être mis à jour en temps réel + dans la boîte de dialogue de programmation.
          • +
          • Ajout d'intitulés à certains contrôles de la boîte de dialogue EPG.
          • +
        • +
        +
        +
        SVN rév. 213 :
        • Implémentation de la recherche de tuner avancée :
            Modifié: trunk/channels.cpp =================================================================== --- trunk/channels.cpp 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/channels.cpp 2009-12-18 11:47:45 UTC (rev 214) @@ -156,6 +156,22 @@ } /** + * \brief Comparaison avec une autre chane pour tri. + * + * \retval Une valeur ngative si cette chane a un rang infrieur l'autre chane + * \retval 0 Si cette chane a un rang gal l'autre chane + * \retval Une valeur positive si cette chane a un rang suprieur l'autre chane + **/ +int Chaine::compare(const Chaine & canal2) const +{ + if (nNumeroChaine < canal2.nNumeroChaine) + return -1; + if (nNumeroChaine > canal2.nNumeroChaine) + return 1; + return _stricmp(nom, canal2.nom) > 0; +} + +/** * Gnration du nom affichable d'une piste audio pour le menu * \param[in] nTrack Numro de la piste audio * \param[in] pstr Pointeur sur le tampon qui recevra le rsultat @@ -183,9 +199,11 @@ static const LPCSTR tblNomsAudio[] = { - "MPG", + "Mpeg", "AC3", - "EAC3" + "EAC3", + "AC3 HC", // HC = Home Cinema + "EAC3 HC" }; char szLangue[32] = ""; @@ -203,8 +221,8 @@ strcpy_T(szLangue, son_courant.lang); return _stprintf_s(pstr, bufSize, - TEXT("Audio %i %") A2t TEXT(" (%") A2t TEXT(")"), nTrack+1, szLangue, - son_courant.type > tst_EAC3 ? "???" : tblNomsAudio[son_courant.type]); + TEXT("Audio %i : %") A2t TEXT(" (%") A2t TEXT(")"), nTrack+1, szLangue, + son_courant.type >= tst_Audio_END ? "???" : tblNomsAudio[son_courant.type]); } /** @@ -250,30 +268,34 @@ } /** - * Obtenir le temps restant avant le prochain changement d'tat EPG concernant cette mission. + * Obtenir le temps restant avant le prochain changement d'tat EPG concernant cette chane. * - * \return Temps restant, exprim en millisecondes, ou bien #DUREE_INFINIE si aucun temps - * ne peut tre dtermin (aucune mission dfinie dans l'EPG ...). + * \param[in] pLocalTime Pointeur sur temps courant (rcupr en interne si NULL) + * \return Temps restant, exprim en millisecondes, ou bien #DUREE_INFINIE si aucun temps + * ne peut tre dtermin (aucune mission dfinie dans l'EPG ...). **/ -long Chaine::timeBeforeNextEvent() const +long Chaine::timeBeforeNextEvent(LPSYSTEMTIME pLocalTime) const { SYSTEMTIME localtime; long nResult = DUREE_INFINIE; - GetLocalTime(&localtime); + if (pLocalTime == NULL) { + GetLocalTime(&localtime); + pLocalTime = &localtime; + } - const Emission * pEmi = getCurrentProgram(localtime); + const Emission * pEmi = getCurrentProgram(*pLocalTime); if (pEmi) { long nTempTime; - nTempTime = DiffTime(localtime, pEmi->debut); + nTempTime = DiffTime(pEmi->debut, *pLocalTime); if (nTempTime>0 && nTempTimefin); + nTempTime = DiffTime(pEmi->fin, *pLocalTime); if (nTempTime>0 && nTempTime canal2.nNumeroChaine || - (nNumeroChaine == canal2.nNumeroChaine && _stricmp(nom, canal2.nom) > 0); } + /** + * \brief Comparaison avec une autre chane pour tri. + * + * \retval Une valeur ngative si cette chane a un rang infrieur l'autre chane + * \retval 0 Si cette chane a un rang gal l'autre chane + * \retval Une valeur positive si cette chane a un rang suprieur l'autre chane + **/ + int compare(const Chaine & canal2) const; + /** + * \brief Comparaison avec une autre chane pour tri. + * + * Utilis par la fonction std::sort + * \retval \p true si cette programmation se classe avant la programmation \p p2 dans le temps. + **/ + bool operator < (const Chaine & canal2) const { + return compare(canal2) < 0; } + /// Gnration du nom affichable pour le menu int toMenuString(LPTSTR pstr, size_t bufSize) const { return _stprintf_s(pstr, bufSize, @@ -209,12 +220,13 @@ LPCTSTR getCurrentProgramName(LPCTSTR pszDefault, bool bStrict=false) const; /** - * Obtenir le temps restant avant le prochain changement d'tat EPG concernant cette mission. + * Obtenir le temps restant avant le prochain changement d'tat EPG concernant cette chane. * + * \param[in] pLocalTime Pointeur sur temps courant (rcupr en interne si NULL) * \return Temps restant, exprim en millisecondes, ou bien #DUREE_INFINIE si aucun temps * ne peut tre dtermin (aucune mission dfinie dans l'EPG ...). **/ - long timeBeforeNextEvent() const; + long timeBeforeNextEvent(LPSYSTEMTIME pLocalTime = NULL) const; /** * Mappage de tous les PIDs de la chane (la frquence est prsume dj syntonise) ; @@ -243,7 +255,8 @@ * En cas d'identit de numro (numro pas attribu = 0, par exemple), * les noms de chanes sont compars. **/ - void tri(); + void tri() { + std::sort(begin(), end()); } /** * Recherche d'une chane en partant de son numro Modifié: trunk/chanutils.cpp =================================================================== --- trunk/chanutils.cpp 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/chanutils.cpp 2009-12-18 11:47:45 UTC (rev 214) @@ -56,10 +56,11 @@ bool liste_pistes::cherche_pid(UINT16 pid) const { - for (int i=0; i= nCount) + return i; + } + return -1; +} + +/// Trouver la piste audio la mieux adapte au choix de l'utilisateur +int liste_pistes::selection_son(AudioMode eAudio) const +{ + int nRes = -1; + + switch(eAudio) { + + case am_Mpeg_1: // On retient la 1re piste MPEG2 trouve + nRes = cherche_piste(&une_piste::isMPEG2); + break; + + case am_Mpeg_2: // On retient la 2nde piste MPEG2 trouve + nRes = cherche_piste(&une_piste::isMPEG2, 2); + break; + + case am_AC3: // On retient la 1re piste AC3 quelle qu'elle soit + nRes = cherche_piste(&une_piste::isAC3); + break; + + case am_AC3_non_HC: // On cherche d'abord la 1re piste AC3 non HC, et si rien trouv, on retient la 1re piste AC3 + nRes = cherche_piste(&une_piste::isAC3_non_HC); + if (nRes < 0) + nRes = cherche_piste(&une_piste::isAC3); + break; + + case am_AC3_HC: // On cherche d'abord la 1re piste AC3 HC, et si rien trouv, on retient la 1re piste AC3 + nRes = cherche_piste(&une_piste::isAC3_HC); + if (nRes < 0) + nRes = cherche_piste(&une_piste::isAC3); + break; + + case am_VO: // am_VO : on retient la 1re piste non francophone disponible + nRes = cherche_piste(&une_piste::isVO); + } + + if (nRes >= 0) + return nRes; + // Rien trouv : on retient la 1re piste audio, quelle qu'elle soit + // (dans l'espoir que a marchera quand mme, sait-on jamais ...) + return 0; +} + +bool une_piste::operator == (const une_piste & up) const +{ + if (pid!=up.pid || type!=up.type) + return false; + return strcmp(lang, up.lang) == 0; +} + void une_piste::getAsLogString(LPTSTR pszBuf, UINT32 nBufSiz) const { _stprintf_s(pszBuf, nBufSiz, TEXT("pid=%4u, type="), pid); Modifié: trunk/chanutils.h =================================================================== --- trunk/chanutils.h 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/chanutils.h 2009-12-18 11:47:45 UTC (rev 214) @@ -53,7 +53,9 @@ tst_Unknown = 0xff, tst_MPEG2 = 0, //!< 0 = MPEG2 Audio Layer II tst_AC3, //!< 1 = AC3 - tst_EAC3, //!< 2 = Extended AC3 + tst_EAC3, //!< 2 = Enhanced AC3 + tst_AC3_hc, //!< 3 = AC3 Home Cinema (plus de 2 canaux, style 5.1) + tst_EAC3_hc, //!< 4 = Enhanced AC3 Home Cinema tst_Audio_END, //!< (limite des codes audio) // // Autres formats : @@ -63,6 +65,17 @@ tst_Other_END }; +/// Indique quelle piste audio sera prfre +enum AudioMode { + am_None, //!< Aucune prfrence + am_Mpeg_1, //!< Utilisation de la premire piste MPEG2 disponible + am_Mpeg_2, //!< Utilisation de la seconde piste MPEG2 disponible + am_AC3, //!< Utilisation de la premire piste AC3 ou EAC3 + am_AC3_non_HC, //!< Utilisation de la premire piste AC3 ou EAC3 non HC + am_AC3_HC, //!< Utilisation de la premire piste AC3 ou EAC, +HC si disponible + am_VO //!< Utilisation de la premire piste non francophone disponible +}; + // Nombre max de pistes son par chane #define NB_MAX_PISTES 32 @@ -72,15 +85,26 @@ char lang[8]; // Efface le tableau de caractre, car pose des problmes des fois si pas effac - une_piste() : pid(0), type(tst_Unknown) {ZeroMemory(lang, sizeof(lang)); }; + une_piste() : pid(0), type(tst_Unknown) { + ZeroMemory(lang, sizeof(lang)); }; une_piste(const une_piste &piste); - bool operator == (const une_piste & up) const - {return pid==up.pid && type==up.type/* && strcmp(lang, up.lang)==0*/;} - // (strcmp pas ncessaire pour le moment) + bool operator == (const une_piste & up) const; + bool operator != (const une_piste & up) const { + return ! operator == (up); } - bool operator != (const une_piste & up) const {return ! operator == (up);}; void getAsLogString(LPTSTR pszBuf, UINT32 nBufSiz) const; + + bool isMPEG2() const { + return type == tst_MPEG2;} + bool isAC3() const { + return type >= tst_AC3 && type <= tst_EAC3_hc;} + bool isAC3_HC() const { + return type == tst_AC3_hc || type == tst_EAC3_hc;} + bool isAC3_non_HC() const { + return type == tst_AC3 || type == tst_EAC3;} + bool isVO() const { + return lang[0]!=0 && strcmp(lang, "fra")!=0 && strcmp(lang, "fre")!=0;} }; struct liste_pistes { @@ -91,6 +115,12 @@ bool cherche_pid(UINT16 pid) const; int ajoute(const une_piste & piste); + + int cherche_piste(bool (une_piste::*fn)() const, int nCount = 1) const; + + /// Trouver la piste audio la mieux adapte au choix de l'utilisateur + int selection_son(AudioMode eAudio) const; + bool operator == (const liste_pistes & lp) const; bool operator != (const liste_pistes & lp) const {return ! operator == (lp);}; }; Modifié: trunk/epg.cpp =================================================================== --- trunk/epg.cpp 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/epg.cpp 2009-12-18 11:47:45 UTC (rev 214) @@ -35,11 +35,11 @@ HWND hEpgDlg = NULL; -#define EPG_COL_CHAINE 0 -#define EPG_COL_DEBUT 1 -#define EPG_COL_FIN 2 -#define EPG_COL_PROGRAMME 3 -#define EPG_COL_DESCRIPT 4 +#define EPG_COL_CHAINE 0 ///< Colonne indiquant le nom de la chane +#define EPG_COL_DEBUT 1 ///< Colonne indiquant l'heure de dbut +#define EPG_COL_FIN 2 ///< Colonne indiquant l'heure de fin +#define EPG_COL_PROGRAMME 3 ///< Colonne indiquant le nom de du programme +#define EPG_COL_DESCRIPT 4 ///< Colonne indiquant la description du programme /** * Ajoute l'emission indique la liste @@ -198,192 +198,211 @@ * - Griser les chanes n'appartenant pas au mme multiplex lorsque des * enregistrements sont en cours. **/ -INT_PTR CALLBACK EpgDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK EpgDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { - static HWND hListItem = NULL; // Handle de la liste - static RECT sSavRect; // Mmorisation du rectangle client dans WM_GETMINMAXINFO et avant WM_SIZE - static DWORD dwLastEpgUpdate = 0; // Instant de la dernire mise jour de l'affichage EPG + static const Tab_cols t_cols[] = { + {TEXT("Chane"), 90}, + {TEXT("Dbut"), 90}, + {TEXT("Fin"), 90}, + {TEXT("Nom du programme"), 220}, + {TEXT("Description"), 1024}, + {NULL, 0} // Terminateur + }; + static HWND hListItem = NULL; //!< Handle de la liste + static RECT sSavRect; //!< Mmorisation du rectangle client dans WM_GETMINMAXINFO et avant WM_SIZE + static DWORD dwLastEpgUpdate = 0; //!< Instant de la dernire mise jour de l'affichage EPG + switch (uMsg) { - case WM_INITDIALOG: { - hListItem = GetDlgItem(hDlg, IDC_LIST_EPG); - // Initialise la liste (ajout de la grille, des colonnes, etc.) + case WM_INITDIALOG: + hListItem = GetDlgItem(hDlg, IDC_LIST_EPG); - static const Tab_cols t_cols[] = { - {TEXT("Chane"), 90}, - {TEXT("Dbut"), 90}, - {TEXT("Fin"), 90}, - {TEXT("Nom du programme"), 220}, - {TEXT("Description"), 1024}, - {NULL, 0} // Terminateur - }; + // Initialise la liste (ajout de la grille, des colonnes, etc.) + ListView_AjouteColonnes(hListItem, t_cols); + remplit_table_epg(hListItem); + init_methodes(hDlg); + ShowCursor(TRUE); // Suspend la disparition temporise du curseur + return TRUE; - ListView_AjouteColonnes(hListItem, t_cols); - remplit_table_epg(hListItem); - init_methodes(hDlg); - ShowCursor(TRUE); // Suspend la disparition temporise du curseur - return TRUE; } + case WM_APPCOMMAND: + switch (GET_APPCOMMAND_LPARAM(lParam)) { - case WM_APPCOMMAND: - switch (GET_APPCOMMAND_LPARAM(lParam)) { - case APPCOMMAND_BROWSER_REFRESH: // Actualise la liste des programmes - PostMessage(hDlg, WM_COMMAND, IDC_RESET_EPG, 0); - return TRUE; - default: - return FALSE; - } + case APPCOMMAND_BROWSER_REFRESH: // Actualise la liste des programmes + PostMessage(hDlg, WM_COMMAND, IDC_RESET_EPG, 0); + return TRUE; - case WM_GETMINMAXINFO: { - MINMAXINFO & sMinMax = *reinterpret_cast(lParam); + } + break; - // Mmoriser l'ancienne taille pour calcul du changement : - GetClientRect(hDlg, &sSavRect); - // Dimensions minimales acceptables : - sMinMax.ptMinTrackSize.x = 480; - sMinMax.ptMinTrackSize.y = 128; - return FALSE; } + case WM_GETMINMAXINFO: { + MINMAXINFO & sMinMax = *reinterpret_cast(lParam); - case WM_SIZE:{ - RECT sRect; + // Mmoriser l'ancienne taille pour calcul du changement : + GetClientRect(hDlg, &sSavRect); + // Dimensions minimales acceptables : + sMinMax.ptMinTrackSize.x = 552; + sMinMax.ptMinTrackSize.y = 128; + break; } - GetClientRect(hDlg, &sRect); + case WM_SIZE:{ + RECT sRect; - // Calcul de la diffrence entre l'ancienne et la nouvelle taille : - int dx = RWdt(sRect)-RWdt(sSavRect); - int dy = RHgt(sRect)-RHgt(sSavRect); + GetClientRect(hDlg, &sRect); - // Dplacement ou redimensionnement des contrles : - ChgCtlPos(hDlg, IDC_METHOD, 0, dy); - ChgCtlPos(hDlg, IDC_AUDIO, 0, dy); - ChgCtlPos(hDlg, IDC_RECORD, 0, dy); - ChgCtlPos(hDlg, IDC_RESET_EPG, dx, dy); - ChgCtlPos(hDlg, IDOK, dx, dy); - ChgCtlSiz(hDlg, IDC_LIST_EPG, dx, dy); - return TRUE; } + // Calcul de la diffrence entre l'ancienne et la nouvelle taille : + int dx = RWdt(sRect)-RWdt(sSavRect); + int dy = RHgt(sRect)-RHgt(sSavRect); - case WM_TIMER: - if (wParam != TIMER_EPG_UPDATE) - return FALSE; - // ... (passage travers) - case WM_APP_EPG_UPDATED: { - // Limiter les mises jour une par seconde - #define EPG_UPDATE_LIMIT 1000 // 1 seconde + // Dplacement ou redimensionnement des contrles : + ChgCtlPos(hDlg, IDC_METHOD_S, 0, dy); + ChgCtlPos(hDlg, IDC_METHOD, 0, dy); + ChgCtlPos(hDlg, IDC_AUDIO_S, 0, dy); + ChgCtlPos(hDlg, IDC_AUDIO, 0, dy); + ChgCtlPos(hDlg, IDC_RECORD, 0, dy); + ChgCtlPos(hDlg, IDC_RESET_EPG, dx, dy); + ChgCtlPos(hDlg, IDOK, dx, dy); + ChgCtlSiz(hDlg, IDC_LIST_EPG, dx, dy); + return TRUE; } - DWORD dwTicks = GetTickCount(); - UINT nDiff = dwTicks-dwLastEpgUpdate; + case WM_TIMER: + switch (wParam) { - KillTimer(hDlg, TIMER_EPG_UPDATE); - if (nDiff < EPG_UPDATE_LIMIT) { - SetTimer(hDlg, TIMER_EPG_UPDATE, EPG_UPDATE_LIMIT-nDiff, NULL); - return TRUE; - } - ListView_DeleteAllItems(hListItem); - dwLastEpgUpdate = dwTicks; - remplit_table_epg(hListItem); - return TRUE; } + case TIMER_EPG_UPDATE: + PostMessage(hDlg, WM_APP_EPG_UPDATED, 0, 0); + return TRUE; + } + break; - case WM_COMMAND: - switch(LOWORD(wParam)) { + case WM_APP_EPG_UPDATED: { + // Limiter les mises jour une par seconde + #define EPG_UPDATE_LIMIT 1000 // 1 seconde - case IDC_METHOD: - case IDC_AUDIO: - if (HIWORD(wParam) == CBN_SELCHANGE) - update_methodes(hDlg); - return TRUE; + DWORD dwTicks = GetTickCount(); + UINT nDiff = dwTicks-dwLastEpgUpdate; - case IDOK: - case IDCANCEL: - DestroyWindow(hDlg); - return TRUE; + KillTimer(hDlg, TIMER_EPG_UPDATE); + if (nDiff < EPG_UPDATE_LIMIT) { + SetTimer(hDlg, TIMER_EPG_UPDATE, EPG_UPDATE_LIMIT-nDiff, NULL); + return TRUE; + } + ListView_DeleteAllItems(hListItem); + dwLastEpgUpdate = dwTicks; + remplit_table_epg(hListItem); + return TRUE; } - case IDC_RESET_EPG: - for (int max=(int)Canaux.size(), i=0; ihdr.idFrom == IDC_LIST_EPG) { - // Notification envoye la liste - if (p->hdr.code == NM_DBLCLK) { - // Double clic sur un lment de la liste - myprintf(TEXT("double clic %i") EOL, p->iItem); + Programmes.push_back(prog); + finalize_prog_change(); + } + } else + affiche_erreurs(TEXT("Pas de programme slectionn")); + return TRUE; } + } + break; - if (p->iItem >= 0) { - LVITEM item = { - LVIF_PARAM, // mask - p->iItem // iItem - // le reste zro (implicite) - }; + case WM_NOTIFY: + if (_nidfr_(lParam) == IDC_LIST_EPG) { + // Notification envoye la liste + switch (_ncode_(lParam)) { - ListView_GetItem(hListItem, &item); + case NM_DBLCLK: { + int nItem = reinterpret_cast(lParam)->iItem; - int ixChaine = Canaux.trouve_par_cle(UINT32(item.lParam)); + // Double clic sur un lment de la liste + myprintf(TEXT("EpgDialogProc, notification double clic %i") EOL, nItem); - if (ixChaine != ixChaineCourante) - zappe_index(ixChaine); - } - } else if (p->hdr.code == LVN_KEYDOWN) { - // On a appuy sur une touche dans la liste - LPNMLVKEYDOWN pkey = (LPNMLVKEYDOWN)lParam; + if (nItem >= 0) { + LVITEM item = { + LVIF_PARAM, // mask + nItem // iItem + // le reste zro (implicite) + }; - if (pkey->wVKey == VK_F5) - PostMessage(hDlg, WM_COMMAND, IDC_RESET_EPG, 0); + ListView_GetItem(hListItem, &item); + + int ixChaine = Canaux.trouve_par_cle(UINT32(item.lParam)); + + if (ixChaine != ixChaineCourante) + zappe_index(ixChaine); } + break; } + + case LVN_KEYDOWN: + // On a appuy sur une touche dans la liste + if (reinterpret_cast(lParam)->wVKey == VK_F5) + PostMessage(hDlg, WM_COMMAND, IDC_RESET_EPG, 0); } - return FALSE; } + } + break; - case WM_CLOSE: - DestroyWindow(hDlg); - return TRUE; - case WM_NCDESTROY: - hEpgDlg = NULL; - ShowCursor(FALSE); // Rtablit la disparition temporise du curseur - return FALSE; + case WM_CLOSE: + DestroyWindow(hDlg); + return TRUE; - default: - return FALSE; + case WM_NCDESTROY: + hEpgDlg = NULL; + ShowCursor(FALSE); // Rtablit la disparition temporise du curseur } + + return FALSE; } + +/// Ouverture de la bote de dialogue EPG +void ShowEpgDialog() +{ + if (hEpgDlg) + BringWindowToTop(hEpgDlg); + else { + hEpgDlg = CreateDialog(hAppInstance, MAKEINTRESOURCE(IDD_EPG), hMainWnd, EpgDialogProc); + ShowWindow(hEpgDlg, SW_SHOW); + } +} Modifié: trunk/epg.h =================================================================== --- trunk/epg.h 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/epg.h 2009-12-18 11:47:45 UTC (rev 214) @@ -30,4 +30,5 @@ extern HWND hEpgDlg; -INT_PTR CALLBACK EpgDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +/// Ouverture de la bote de dialogue EPG +void ShowEpgDialog(); Modifié: trunk/graph.cpp =================================================================== --- trunk/graph.cpp 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/graph.cpp 2009-12-18 11:47:45 UTC (rev 214) @@ -2207,6 +2207,7 @@ break; case tst_EAC3: + case tst_EAC3_hc: if (!sEac3Codec.isNull()) { hr = sEac3Codec.branche_pid(pid); break; @@ -2216,6 +2217,7 @@ // Ce "mode de compatibilit" devrait pouvoir tre supprim d'ici un ou deux ans. // ... (passage travers) case tst_AC3: + case tst_AC3_hc: hr = sAc3_Codec.branche_pid(pid); break; Modifié: trunk/ini.cpp =================================================================== --- trunk/ini.cpp 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/ini.cpp 2009-12-18 11:47:45 UTC (rev 214) @@ -171,7 +171,7 @@ bool use_msn = false; TCHAR titre_fenetre[128] = TEXT(""); bool on_top = false; -bool use_ac3 = false; +AudioMode audio_pref = am_None; bool use_osd = true; COLORREF osd_color = INI_OSD_COLOR; COLORREF aCustomColors[16] = {0}; @@ -267,7 +267,7 @@ * Table d'associations pour nommer les tats possible des chanes. **/ const AssocElement aChStateTable[] = -{ // EtatChaine +{ // EtatChaine {TEXT("Inactive"), ec_inactive}, {TEXT("Active"), ec_active}, {TEXT("Prfre"), ec_preferee}, @@ -336,9 +336,13 @@ **/ AssocElement aEpgRecAudio[] = { // AudioMode - {TEXT("Audio1"), audio_1}, - {TEXT("Audio2"), audio_2}, - {TEXT("AC3"), audio_AC3}, + {TEXT("Aucune"), am_None}, + {TEXT("Audio1"), am_Mpeg_1}, + {TEXT("Audio2"), am_Mpeg_2}, + {TEXT("AC3"), am_AC3}, + {TEXT("AC3 2.0"), am_AC3_non_HC}, + {TEXT("AC3 HC"), am_AC3_HC}, + {TEXT("V.O."), am_VO}, {NULL,0} // -> terminateur }; @@ -381,7 +385,7 @@ }; /** - * Tableau associatif dcrivant les mthodes de recherche des chanes + * Tableau associatif dcrivant les offsets de recherche des chanes **/ AssocElement aOffsetsToUse[] = { // OffsetsToUse @@ -460,7 +464,7 @@ {TEXT("Recherche stricte"), cit_BOOL, true, & exact_match}, {TEXT("Graphe alternatif"), cit_BOOL, false, & autre_graphe}, - {TEXT("Utilise AC3 quand dispo"), cit_BOOL, false, & use_ac3}, + {TEXT("Prfrence audio"), cit_ASSOC, false, & audio_pref, CONFIG_VAL(aEpgRecAudio)}, {TEXT("Ville"), cit_STR, CONFIG_VAL(NULL_NAME), CONFIG_STR(nomVille)}, {TEXT("Liste de canaux"), cit_STR, CONFIG_VAL(TEXT("21-69")), CONFIG_STR(liste_canaux)}, @@ -484,7 +488,7 @@ {TEXT("Nom du fichier d'enregistrement"), cit_STR, CONFIG_VAL(TEXT(MOTIF_NOMS_ENREG_DEFAULT)), CONFIG_STR(motif_noms_enreg)}, {TEXT("Type d'enregistrement video"), cit_ASSOC, meth_TS, & epg_typerecvideo, CONFIG_VAL(aEpgRecVideo)}, - {TEXT("Type d'enregistrement audio"), cit_ASSOC, audio_1, & epg_typerecaudio, CONFIG_VAL(aEpgRecAudio)}, + {TEXT("Type d'enregistrement audio"), cit_ASSOC, am_Mpeg_1, & epg_typerecaudio, CONFIG_VAL(aEpgRecAudio)}, {TEXT("Titre de la fentre"), cit_STR, CONFIG_VAL(szAppName), CONFIG_STR(titre_fenetre)}, {TEXT("Fentre toujours devant"), cit_BOOL, false, & on_top}, Modifié: trunk/ini.h =================================================================== --- trunk/ini.h 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/ini.h 2009-12-18 11:47:45 UTC (rev 214) @@ -98,13 +98,6 @@ meth_multiplex //!< 2: Le multiplex entier sera enregistr }; -/// Indique quelle piste audio sera utilise dans un enregistrement -enum AudioMode { - audio_1, //!< Utilisation de la premire piste MPEG2 disponible - audio_2, //!< Utilisation de la seconde piste MPEG2 disponible - audio_AC3 //!< Utilisation de la premire piste AC3 disponible -}; - /// Mthode de recherche des nouvelles chanes enum SearchMethod { sm_undef, //!< Indfini @@ -178,7 +171,8 @@ extern bool use_msn; //!< Indique que l'affichage dans MSN est actif extern TCHAR titre_fenetre[128]; //!< Nom affich dans la barre de titre de la fentre extern bool on_top; //!< Indique que l'affichage doit se faire devant toutes les autres fentres -extern bool use_ac3; //!< Indique qu'on veut utiliser le codec AC3 quand il est disponible +extern AudioMode + audio_pref; //!< Indique la prfrence audio pour l'affichage extern bool use_osd; //!< \p true si l'OSD doit tre utilis extern INT32 osd_transparency; //!< Transparence OSD \todo implmnter configuration quand il y aura une place @@ -636,9 +630,9 @@ LPTSTR nom; ///< Nom de l'action pour afficher dans la fentre des options LPTSTR nom_option; ///< Nom de l'option permettant de l'associer dans le fichier de configuration ///< Elle sera moins modifie que la valeur numrique #action - Raccourci defaut; ///< Raccourcis par dfaut - Raccourci raccourci; ///< Raccourcis principal - Raccourci alternatif; ///< Raccourcis alternatif + Raccourci defaut; ///< Raccourci par dfaut + Raccourci raccourci; ///< Raccourci principal + Raccourci alternatif; ///< Raccourci alternatif ShortcutItem &operator =(const ShortcutItem &s); }; Modifié: trunk/main.cpp =================================================================== --- trunk/main.cpp 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/main.cpp 2009-12-18 11:47:45 UTC (rev 214) @@ -112,7 +112,7 @@ #define DUREE_SHOW_PROGRAMME 2500 // Positions des sous-menus du menu principal : -#define MENU_FICHIER_POSITION 0 +#define MENU_FICHIER_POSITION 0 #define MENU_FILTRES_POSITION 1 #define MENU_COMMANDES_POSITION 2 #define MENU_CHAINES_POSITION 3 @@ -493,7 +493,7 @@ // Enregistrement sur une autre chane que la chane en cours : TCHAR buf[128]; - formate_menu_chaine_nom(i, TEXT("Stopper l'enregistrement"), buf, _countof(buf)); + formate_menu_chaine_nom(i, TEXT("Arrter l'enregistrement"), buf, _countof(buf)); InsertMenu(hRecMenu, IDM_DELAYED_STOP, MF_BYCOMMAND, IDM_STOP_RECORD_BASE+i, buf); } } @@ -811,13 +811,13 @@ } -static void popup_menu(bool from_tray_icon) { - POINT pos; +static void popup_menu(bool from_tray_icon) +{ + HMENU hPopMenu = CreatePopupMenu(); + POINT pos; + GetCursorPos(&pos); - bool menu_desactive = false; - HMENU hPopMenu = CreatePopupMenu(); - // Copie des menus 0=Fichier, 1=Filtres, 2=Commandes, // 3=Chaines, 4=Pistes, 5=Captures, 6=Programme. for (int i=0; i<=6; i++) { @@ -831,35 +831,31 @@ // Met jour les menus (chanes + pistes) update_all_menus_popup(hPopMenu); - // Dsactive des menus si Minimis + suspendu - if (menu_desactive) { - EnableMenuItem(hPopMenu, MENU_CHAINES_POSITION, MF_BYPOSITION | MF_GRAYED); - EnableMenuItem(hPopMenu, MENU_PISTES_POSITION, MF_BYPOSITION | MF_GRAYED); - } - if (from_tray_icon) { - // Ajoute d'autres infos si venant du tray + // Ajoute d'autres infos si venant de la zone de notification // (effectu la fin, pour que les oprations prcdentes n'aient // pas besoin de s'effectuer avec des positions de menus dcales) MENUITEMINFO mnu = { - sizeof(mnu), // cbSize - MIIM_BITMAP // fMask + sizeof(mnu), // cbSize + MIIM_BITMAP|MIIM_ID|MIIM_STRING // fMask // le reste zro (implicite) }; if (!IsMinimized(hMainWnd)) { - InsertMenu(hPopMenu, 0, MF_BYPOSITION|MF_STRING, IDM_MINIMIZE, TEXT("R&duire la fentre")); - mnu.hbmpItem = HBMMENU_POPUP_MINIMIZE; + mnu.wID = IDM_MINIMIZE; + mnu.hbmpItem = HBMMENU_POPUP_MINIMIZE; + mnu.dwTypeData = TEXT("R&duire la fentre"); } else { - InsertMenu(hPopMenu, 0, MF_BYPOSITION|MF_STRING, IDM_RESTORE, TEXT("&Restaurer la fentre")); - mnu.hbmpItem = HBMMENU_POPUP_RESTORE; - - if (suspend_minimized) - menu_desactive = true; + mnu.wID = IDM_RESTORE; + mnu.hbmpItem = HBMMENU_POPUP_RESTORE; + mnu.dwTypeData = TEXT("&Restaurer la fentre"); } - SetMenuItemInfo(hPopMenu, 0, TRUE, &mnu); - + InsertMenuItem(hPopMenu, 0, TRUE, &mnu); InsertMenu(hPopMenu, 1, MF_BYPOSITION|MF_SEPARATOR, NULL, NULL); + + // Rplication de l'item "Quitter" la fin du menu dans la zone de notification + AppendMenu(hPopMenu, MF_SEPARATOR, NULL, NULL); + AppendMenu(hPopMenu, MF_STRING, IDM_QUIT, TEXT("&Quitter")); } SetForegroundWindow(hMainWnd); @@ -1688,7 +1684,9 @@ case IDM_DSOUND: switch(current_sound_type()) { case tst_MPEG2: create_property_dialog(ft_DSnd_Mp2a); break; + case tst_AC3_hc: case tst_AC3: create_property_dialog(ft_DSnd_AC3); break; + case tst_EAC3_hc: case tst_EAC3: create_property_dialog(ft_DSnd_EAC3); } break; @@ -1794,12 +1792,7 @@ break; case IDM_EPG: - if (hEpgDlg) - BringWindowToTop(hEpgDlg); - else { - hEpgDlg = CreateDialog(hAppInstance, MAKEINTRESOURCE(IDD_EPG), hMainWnd, EpgDialogProc); - ShowWindow(hEpgDlg, SW_SHOW); - } + ShowEpgDialog(); break; case IDM_SIGNAL: Modifié: trunk/mpeg2defs.h =================================================================== --- trunk/mpeg2defs.h 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/mpeg2defs.h 2009-12-18 11:47:45 UTC (rev 214) @@ -490,32 +490,80 @@ mdt_STD = 0x11, // System Target Decoder ? mdt_IBP = 0x12, // - // http://www.coolstf.com/tsreader/descriptors.html + // http://www.coolstf.com/tsreader/descriptors.html ou ETSI EN 300 468 mdt_Network_Name = 0x40, mdt_Service_List = 0x41, + mdt_Stuffing = 0x42, + mdt_Sat_Delivery_System = 0x43, + mdt_Cable_Delivery_System = 0x44, mdt_VBI_Data = 0x45, + mdt_VBI_Teletext = 0x46, + mdt_Bouquet_Name = 0x47, mdt_Service = 0x48, + mdt_Country_Availability = 0x49, mdt_Linkage = 0x4a, + mdt_NVOD_Reference = 0x4b, + mdt_Time_Shifted_Service = 0x4c, mdt_Short_Event = 0x4d, mdt_Extended_Event = 0x4e, + mdt_Time_Shifted_Event = 0x4f, mdt_Component = 0x50, + mdt_Mosaic = 0x51, mdt_Stream_Identifier = 0x52, + mdt_CA_Indentifier = 0x53, mdt_Content = 0x54, mdt_Parental_Rating = 0x55, mdt_Teletext = 0x56, + mdt_Telephone = 0x57, + mdt_Local_Time_Offset = 0x58, mdt_Subtitling = 0x59, mdt_Terrestrial_Deliv_Sys = 0x5a, + mdt_Multiling_Network_Name = 0x5b, + mdt_Multiling_Bouquet_Name = 0x5c, + mdt_Multiling_Service_Name = 0x5d, + mdt_Multiling_Component = 0x5e, mdt_Private_Data = 0x5f, - // + mdt_Service_Move = 0x60, + mdt_Short_Smoothing_Buffer = 0x61, + mdt_Frequency_List = 0x62, + mdt_Partial_TransportStream = 0x63, + mdt_Data_Broadcast = 0x64, + mdt_Scrambling = 0x65, mdt_Data_Broadcast_ID = 0x66, - mdt_AC3_Audio = 0x6a, // DVB + mdt_Transport_Stream = 0x67, + mdt_DSNG = 0x68, + mdt_PDC = 0x69, + mdt_AC3_Audio = 0x6a, + mdt_Ancillary_Data = 0x6b, + mdt_Cell_List = 0x6c, + mdt_Cell_Frequency_Link = 0x6d, + mdt_Announcement_Support = 0x6e, + mdt_Application_Signaling = 0x6f, + mdt_Adatation_Field_Data = 0x70, + mdt_Service_Identifier = 0x71, + mdt_Service_Availability = 0x72, + mdt_Default_Authority = 0x73, + mdt_Related_Content = 0x74, + mdt_TVA_ID = 0x75, + mdt_Content_Identifier = 0x76, + mdt_Time_Slice_FEC_Ident = 0x77, + mdt_ECM_Repetition_Rate = 0x78, + mdt_S2_Sat_Delivery_System = 0x79, mdt_Enhanced_AC3_Audio = 0x7a, + mdt_DTS_Audio = 0x7b, + mdt_AAC_Audio = 0x7c, + mdt_XAIT_Location = 0x7d, + mdt_FTA_Content_Management = 0x7e, + mdt_Extension = 0x7f, // + mdt_User_Defined_First = 0x80, // user defined 0x80 to 0xFE + // mdt_AC3_Audio__2 = 0x81, // DCII ou ATSC mdt_Logical_Channel = 0x83, - mdt_HD_simcast_log_channel = 0x88 + mdt_HD_simcast_log_channel = 0x88, // /* codes 0x95 0xa1 identifier - ... SCTE ou ATSC ??? */ + mdt_User_Defined_Last = 0xfe }; /** @@ -1227,12 +1275,44 @@ #define AC3_MAINID_FLAG 0x20 #define AC3_ASVC_FLAG 0x10 +enum AC3_NumberOfChannels +{ + anc_Undef = -1, + anc_Mono = 0, + anc_1_plus_1, + anc_Stereo, + anc_DolbySurroundStereo, + anc_Multi_MoreThan_2_0, + anc_Multi_MoreThan_5_1, + anc_Multiple_Independant, + anc_Reserved +}; + +enum AC3_ServiceType +{ + ast_Undef = -1, + anc_Complete_Main = 0, + anc_MusicAndEffects, + anc_VisuallyImpaired, + anc_HearingImpaired, + anc_Dialogue, + anc_Commentary, + anc_Emergency, + anc_Voiceover, + anc_Karaoke +}; + + struct MDescriptor_6a : public MDescriptor // tag = mdt_AC3_Audio { UINT8 ac3_flags; UINT8 flags() const { return UINT8(ac3_flags & 0xf0);} + AC3_NumberOfChannels number_of_channels() const { + return ac3_flags & AC3_COMPONENT_TYPE_FLAG ? static_cast(*PUINT8(this+1) & 0x07) : anc_Undef;} + AC3_ServiceType service_type() const { + return ac3_flags & AC3_COMPONENT_TYPE_FLAG ? static_cast((*PUINT8(this+1)>>3) & 0x07) : ast_Undef;} }; struct MDescriptor_6a_unwrapper Modifié: trunk/parse.cpp =================================================================== --- trunk/parse.cpp 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/parse.cpp 2009-12-18 11:47:45 UTC (rev 214) @@ -106,10 +106,18 @@ break; case st_MPEG_1_audio: //ISO_IEC_11172_3_AUDIO, MPEG-1 audio streams case st_MPEG_2_audio: //ISO_IEC_13818_3_AUDIO, MPEG-2 audio streams - pmt_piste.pid = pid; - pmt_piste.type = tst_MPEG2; + pmt_piste.pid = pid; + pmt_piste.type = tst_MPEG2; + // Recherche de descripteurs de langue : + for (; !sd; ++sd) { + if (sd().tag() == mdt_ISO_639_Language && sd().length > 0) + sd().as()().language_code.get(pmt_piste.lang); + } break; case st_PES_private: + pmt_piste.type = tst_Unknown; // type par dfaut + pmt_piste.pid = pid; + // Recherche de descripteurs audio et autres : for (; !sd; ++sd) { MDescriptorTag eTag = sd().tag(); @@ -117,19 +125,21 @@ switch (eTag) { case mdt_AC3_Audio: - pmt_piste.pid = pid; - pmt_piste.type = tst_AC3; + if (sd().as().number_of_channels() >= anc_Multi_MoreThan_2_0) + pmt_piste.type = tst_AC3_hc; + else + pmt_piste.type = tst_AC3; break; case mdt_Enhanced_AC3_Audio: - pmt_piste.pid = pid; - pmt_piste.type = tst_EAC3; + if (sd().as().number_of_channels() >= anc_Multi_MoreThan_2_0) + pmt_piste.type = tst_EAC3_hc; + else + pmt_piste.type = tst_EAC3; break; case mdt_Teletext: - pmt_piste.pid = pid; pmt_piste.type = tst_Teletext; break; case mdt_Subtitling: - pmt_piste.pid = pid; pmt_piste.type = tst_Subtitling; break; case mdt_ISO_639_Language: @@ -138,10 +148,6 @@ break; case mdt_Conditional_Access: bEncrypted = true; - break; - default: - pmt_piste.pid = pid; - pmt_piste.type = tst_Unknown; } } Modifié: trunk/record.cpp =================================================================== --- trunk/record.cpp 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/record.cpp 2009-12-18 11:47:45 UTC (rev 214) @@ -118,8 +118,10 @@ int ixProg = trouve_prog_par_nom(nom); - if (ixProg>=0) + if (ixProg>=0) { Programmes[ixProg].etat = epr_supplante; // tat de l'ancienne programmation utilise + record_list_updated(); + } fin = pProg->fin; apres = pProg->apres; @@ -258,15 +260,12 @@ /** * Rechercher si une chane est en cours d'enregistrement, * et si oui, obtenir l'index du descripteur de cet enregistrement. - * \param[in] ixChaine Index (dans la table #Canaux) de la chane concerne, ou bien - * \p STREAM_PSEUDO_INDEX pour spcifier tout le multiplex courant - * \retval Index du descripteur dans la table des descripteurs d'enregistrements en cours - * \retval -1 si la chane n'est pas en cours d'enregistrement. + * \param[in] cleChaine Cl de la chane concerne + * \retval Index du descripteur dans la table des descripteurs d'enregistrements en cours + * \retval -1 si la chane n'est pas en cours d'enregistrement. **/ -int Enregistrements::getRecordingDescr(int ixChaine) const +int Enregistrements::getRecordingDescrByKey(UINT32 cleChaine) const { - UINT32 cleChaine = indexToCle(ixChaine); - if (cleChaine!=0) { for (int nInx=0; nInx < count(); nInx++) { if (cRecord[nInx].isChannel(cleChaine)) Modifié: trunk/record.h =================================================================== --- trunk/record.h 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/record.h 2009-12-18 11:47:45 UTC (rev 214) @@ -159,12 +159,22 @@ /** * Rechercher si une chane est en cours d'enregistrement, * et si oui, obtenir l'index du descripteur de cet enregistrement. + * \param[in] cleChaine Cl de la chane concerne + * \retval Index du descripteur dans la table des descripteurs d'enregistrements en cours + * \retval -1 si la chane n'est pas en cours d'enregistrement. + **/ + int getRecordingDescrByKey(UINT32 cleChaine) const; + + /** + * Rechercher si une chane est en cours d'enregistrement, + * et si oui, obtenir l'index du descripteur de cet enregistrement. * \param[in] ixChaine Index (dans la table #Canaux) de la chane concerne, ou bien * \p STREAM_PSEUDO_INDEX pour spcifier tout le multiplex courant * \retval Index du descripteur dans la table des descripteurs d'enregistrements en cours * \retval -1 si la chane n'est pas en cours d'enregistrement. **/ - int getRecordingDescr(int ixChaine) const; + int getRecordingDescr(int ixChaine) const { + return getRecordingDescrByKey(indexToCle(ixChaine));} /** * Rechercher si un multiplex est en cours d'enregistrement, Modifié: trunk/recprog.cpp =================================================================== --- trunk/recprog.cpp 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/recprog.cpp 2009-12-18 11:47:45 UTC (rev 214) @@ -949,23 +949,24 @@ const Emission & emis = canal.emis[noEmis]; - strcpy_T(prog.nom, emis.nom); - prog.cleChaine = canal.cle(); - prog.sidChaine = canal.SID; /// \deprecated \p sidChaine remplac par \p cleChaine - prog.nNumeroChaine = canal.nNumeroChaine; - prog.apres = apr_rien; - prog.methode = meth_TS; - prog.audio = audio_1; + _tcsncpy_s(prog.nom, emis.nom, _countof(prog.nom)-1); // Tronquer si la longueur dpasse + prog.nom[_countof(prog.nom)-1] = 0; + prog.cleChaine = canal.cle(); + prog.sidChaine = canal.SID; /// \deprecated \p sidChaine remplac par \p cleChaine + prog.nNumeroChaine = canal.nNumeroChaine; + prog.apres = apr_rien; + prog.methode = meth_TS; + prog.audio = am_Mpeg_1; // Ajout de l'heure de dbut et de l'heure de fin, avec leurs dcalages respectifs : - prog.fin = emis.fin; + prog.fin = emis.fin; AddTime(prog.fin, retard_enreg * 60000); - prog.debut = emis.debut; + prog.debut = emis.debut; AddTime(prog.debut, avance_enreg * -60000); - prog.repetition = 0; - prog.tache = planif_sans; - prog.etat = epr_actif; + prog.repetition = 0; + prog.tache = planif_sans; + prog.etat = epr_actif; return true; } @@ -1020,25 +1021,33 @@ /** * Remplissage d'une combo-box de mthodes d'enregistement + * \param[in] hCtl "Handle" de la combo-box + * \param[in] eSel Item slectionn **/ -void remplit_liste_methodes(HWND hCtl) +void remplit_liste_methodes(HWND hCtl, MethodeEnregistrement eSel) { SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("TS")); SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("PS")); if (allow_stream_record) SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("Multiplex")); - SendMessage(hCtl, CB_SETCURSEL, meth_TS, 0); + SendMessage(hCtl, CB_SETCURSEL, eSel, 0); } /** * Remplissage d'une combo-box d'items audio + * \param[in] hCtl "Handle" de la combo-box + * \param[in] eSel Item slectionn **/ -void remplit_liste_audio(HWND hCtl) +void remplit_liste_audio(HWND hCtl, AudioMode eSel) { - SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("Audio 1")); - SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("Audio 2")); - SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("Audio AC3")); - SendMessage(hCtl, CB_SETCURSEL, audio_1, 0); + SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("1re piste")); + SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("Mpeg (1re)")); + SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("Mpeg (2me)")); + SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("(E)AC3")); + SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("(E)AC3 2.0")); + SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("(E)AC3 HC")); + SendMessage(hCtl, CB_ADDSTRING, 0, (LPARAM)TEXT("V.O.")); + SendMessage(hCtl, CB_SETCURSEL, eSel, 0); } /** @@ -1050,13 +1059,9 @@ HWND hCtlMtd = GetDlgItem(hDlg, IDC_METHOD); HWND hCtlAud = GetDlgItem(hDlg, IDC_AUDIO); - remplit_liste_methodes(hCtlMtd); - remplit_liste_audio(hCtlAud); + remplit_liste_methodes(hCtlMtd, epg_typerecvideo); + remplit_liste_audio(hCtlAud, epg_typerecaudio); - // Slectionne le dernier paramtre utilis pour l'enregistrement - SendMessage(hCtlMtd, CB_SETCURSEL, epg_typerecvideo, NULL); - SendMessage(hCtlAud, CB_SETCURSEL, epg_typerecaudio, NULL); - EnableWindow(hCtlAud, epg_typerecvideo == meth_PS); } @@ -1220,7 +1225,7 @@ if (prog.etat == epr_encours) MessageBox(hDlg, TEXT("Cet enregistrement est actuellement en cours.") EOL - TEXT("Utilisez la commande \"Stopper l'enregistrement dans...\"") + TEXT("Utilisez la commande \"Arrter l'enregistrement dans...\"") TEXT(" pour y apporter des modifications maintenant."), TEXT("Erreur lors de la modification"), MB_ICONERROR); else { @@ -1561,8 +1566,9 @@ if (ixProg>=0) { Programme & prog = Programmes[ixProg]; - if (prog.repetition!=0) { - // La programmation comporte des rptisions : + programmation_modifiee = true; + if (prog.repetition != 0) { + // La programmation comporte des rptitions : // on se contente de la "dconnecter" de l'enregistrement, lui permettant // ainsi d'tre reporte intgralement son occurrence suivante. prog.etat = epr_supplante; @@ -1579,9 +1585,8 @@ prog.fin = refTime; prog.apres = apres; } - record_list_updated(); } - programmation_modifiee = true; + record_list_updated(); } setChangedState(des_notModified); @@ -1598,7 +1603,7 @@ case WM_INITDIALOG: edat.hDlg = hDlg; - edat.hEnrCombo = GetDlgItem(hDlg, IDC_RECORD); + edat.hEnrCombo = GetDlgItem(hDlg, IDC_CHANNEL); edat.hTimeCtl = GetDlgItem(hDlg, IDC_DELAYED_STOP); edat.ixRecDescr = enregistrements_actuels.getRecordingDescr(ixChaineCourante); edat.load(false /*true*/); @@ -1620,7 +1625,7 @@ case WM_COMMAND: { switch(wParam) { - case _cmd_(IDC_RECORD, CBN_SELCHANGE): { + case _cmd_(IDC_CHANNEL, CBN_SELCHANGE): { int newSel = (int)SendMessage(edat.hEnrCombo, CB_GETCURSEL, 0, 0); if (newSel!=CB_ERR && newSel!=edat.comboSel) { @@ -1741,34 +1746,6 @@ record_list_updated(); } -// Trouver la piste audio la mieux adapte au choix de l'utilisateur lors de la programmation : -static int selection_son(const liste_pistes & sons, AudioMode audio) -{ - int nbr_trouve = 0; // Comptage des pistes MPEG2 trouves - - for(int i=0; i= 2) - return i; - break; - case audio_AC3: // audio_AC3 : on retient la 1re piste AC3 trouve - if (son_type == tst_AC3) - return i; - } - } - - // Rien trouv : on retient la 1re piste audio, quelle qu'elle soit - // (dans l'espoir que a marchera quand mme, sait-on jamais ...) - return 0; -} - /** * Dmarre tous les enregistrements qui devraient l'tre cet instant prcis. * Retourne 'true' si au moins un changement de nature affecter les menus @@ -1842,7 +1819,7 @@ if (ixRecDescr < 0) { // Si elle ne l'est pas, on dmarre l'enregistrement : - int ixSon = selection_son(canal.sons, prog.audio); // utilis seulement en PS pour le moment + int ixSon = canal.sons.selection_son(prog.audio); // utilis seulement en PS pour le moment switch(prog.methode) { case meth_TS: Modifié: trunk/recprog.h =================================================================== --- trunk/recprog.h 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/recprog.h 2009-12-18 11:47:45 UTC (rev 214) @@ -285,14 +285,16 @@ /** * Remplissage d'une combo-box de mthodes d'enregistement * \param[in] hCtl "Handle" de la combo-box + * \param[in] eSel Item slectionn **/ -void remplit_liste_methodes(HWND hCtl); +void remplit_liste_methodes(HWND hCtl, MethodeEnregistrement eSel); /** * Remplissage d'une combo-box d'items audio * \param[in] hCtl "Handle" de la combo-box + * \param[in] eSel Item slectionn **/ -void remplit_liste_audio(HWND hCtl); +void remplit_liste_audio(HWND hCtl, AudioMode eSel); /** * Initialisation des items de mthodes d'enregistrement d'un dialogue d'enregistrements programms Modifié: trunk/rendering.h =================================================================== --- trunk/rendering.h 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/rendering.h 2009-12-18 11:47:45 UTC (rev 214) @@ -324,7 +324,7 @@ /// \param[in] sRefs Le rectangle total utilisable pour l'OSD /// \param[out] sRefs Le rectangle rajust l'objet courant virtual void AdjustOsdRefs(OsdRefs & sRefs) const { - sRefs.left += RWdt(sRefs) / 2; // Demi largeur ( droite) + sRefs.left += RWdt(sRefs) / 3; // 2/3 largeur ( droite) sRefs.top = sRefs.bottom - sRefs.nFntHgt;} // Aligner en bas public: /// Constructeur @@ -341,7 +341,7 @@ /// \param[in] sRefs Le rectangle total utilisable pour l'OSD /// \param[out] sRefs Le rectangle rajust l'objet courant virtual void AdjustOsdRefs(OsdRefs & sRefs) const { - sRefs.right -= RWdt(sRefs) / 2; // Demi largeur ( gauche) + sRefs.right -= RWdt(sRefs) / 3; // Tiers de largeur ( gauche) sRefs.top = sRefs.bottom - sRefs.nFntHgt;} // Aligner en bas public: /// Constructeur Modifié: trunk/res.rc =================================================================== --- trunk/res.rc 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/res.rc 2009-12-18 11:47:45 UTC (rev 214) @@ -105,8 +105,8 @@ MENUITEM "Enregistrer la chane en &PS", IDM_RECORD_CHANNEL_PS MENUITEM "Enregistrer la chane en &TS", IDM_RECORD_CHANNEL_TS MENUITEM SEPARATOR - MENUITEM "&Stopper l'enregistrement", IDM_STOP_RECORD - MENUITEM "Stopper l'enregistrement &dans", IDM_DELAYED_STOP + MENUITEM "&Arrter l'enregistrement", IDM_STOP_RECORD + MENUITEM "Arrter l'enregistrement &dans", IDM_DELAYED_STOP MENUITEM SEPARATOR MENUITEM "&Capture d'cran", IDM_SCREENSHOT END @@ -182,7 +182,8 @@ CONTROL "Resyntonisaton automatique en cas d'erreur du graphe (dsactiver en cas de problmes)",IDC_AUTO_RETUNE, "Button",BS_AUTOCHECKBOX | BS_VCENTER | BS_MULTILINE | WS_GROUP | WS_TABSTOP,154,16,124,24 GROUPBOX "Audio",IDC_STATIC,7,48,136,28 - CONTROL "Utiliser l'AC3 par dfaut",IDC_AC3_DEF,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_GROUP | WS_TABSTOP,14,60,124,10 + LTEXT "Piste audio prfre:",IDC_STATIC,14,57,40,16 + COMBOBOX IDC_AUDIO,64,59,74,10,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP GROUPBOX "Avanc",IDC_STATIC,146,48,136,28 CONTROL "Permettre l'enregistrement intgral du multiplex courant",IDC_ALLOW_STREAM_RECORD, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_GROUP | WS_TABSTOP,154,57,124,16 @@ -285,12 +286,14 @@ CAPTION "Guide des programmes" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - CONTROL "",IDC_LIST_EPG,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_GROUP | WS_TABSTOP,0,0,569,282 - COMBOBOX IDC_METHOD,7,290,54,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_GROUP | WS_TABSTOP - COMBOBOX IDC_AUDIO,69,290,54,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Enregistrer",IDC_RECORD,131,289,54,14,WS_GROUP - PUSHBUTTON "Rinitialiser",IDC_RESET_EPG,446,289,54,14,WS_GROUP - DEFPUSHBUTTON "Fermer",IDOK,508,289,54,14 + CONTROL "",IDC_LIST_EPG,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_GROUP | WS_TABSTOP,0,0,569,282 + LTEXT "Mthode:",IDC_METHOD_S,7,283,54,8 + COMBOBOX IDC_METHOD,7,292,52,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "Piste audio:",IDC_AUDIO_S,67,283,56,8 + COMBOBOX IDC_AUDIO,67,292,56,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Programmer enregistrement",IDC_RECORD,131,291,101,14,WS_GROUP + PUSHBUTTON "Rinitialiser",IDC_RESET_EPG,446,291,54,14,WS_GROUP + DEFPUSHBUTTON "Fermer",IDOK,508,291,54,14 END IDD_SIGNAL DIALOGEX 100, 100, 164, 132 @@ -316,25 +319,28 @@ CAPTION "Enregistrements programms" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - LTEXT "Dbut de l'enregistrement :",IDC_STATIC,7,6,100,10 - CONTROL "",IDC_DATE_START,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,7,18,56,12 - CONTROL "",IDC_TIME_START,"SysDateTimePick32",DTS_UPDOWN | WS_TABSTOP | 0x8,67,18,49,12 - LTEXT "Fin de l'enregistrement :",IDC_STATIC,123,6,100,10 - CONTROL "",IDC_DATE_END,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,124,18,56,12 - CONTROL "",IDC_TIME_END,"SysDateTimePick32",DTS_UPDOWN | WS_TABSTOP | 0x8,184,18,49,12 - COMBOBOX IDC_CHANNEL,7,34,109,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_METHOD,124,34,52,18,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_AUDIO,180,34,53,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Nom de l'enregistrement :",IDC_STATIC,14,51,89,12,SS_CENTERIMAGE - EDITTEXT IDC_NAME,99,51,134,12,ES_AUTOHSCROLL + LTEXT "Dbut de l'enregistrement :",IDC_STATIC,7,6,100,8 + CONTROL "",IDC_DATE_START,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,7,15,56,12 + CONTROL "",IDC_TIME_START,"SysDateTimePick32",DTS_UPDOWN | WS_TABSTOP | 0x8,67,15,49,12 + LTEXT "Fin de l'enregistrement :",IDC_STATIC,123,6,100,8 + CONTROL "",IDC_DATE_END,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,124,15,56,12 + CONTROL "",IDC_TIME_END,"SysDateTimePick32",DTS_UPDOWN | WS_TABSTOP | 0x8,184,15,49,12 + LTEXT "Chane:",IDC_STATIC,7,28,56,8 + COMBOBOX IDC_CHANNEL,7,37,109,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Mthode:",IDC_STATIC,124,28,50,8 + COMBOBOX IDC_METHOD,124,37,50,18,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Piste audio:",IDC_STATIC,177,28,56,8 + COMBOBOX IDC_AUDIO,177,37,56,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Nom de l'enregistrement:",IDC_STATIC,14,53,89,12,SS_CENTERIMAGE + EDITTEXT IDC_NAME,99,53,134,12,ES_AUTOHSCROLL CONTROL "Ajouter aux tches planifes de Windows",IDC_TACHE, - "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,14,65,153,12 - CONTROL "Dsactiv",IDC_INACTIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,184,65,49,12 - GROUPBOX "Aprs l'enregistrement :",IDC_AFTER_RECORD,7,77,226,41 - CONTROL "Fermer Pouchin TV Mod",IDC_AFTER,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,14,85,102,13 + "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,14,69,153,8 + CONTROL "Dsactiv",IDC_INACTIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,184,69,49,8 + GROUPBOX "Aprs l'enregistrement :",IDC_AFTER_RECORD,7,78,226,40 + CONTROL "Fermer Pouchin TV Mod",IDC_AFTER,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,14,86,102,13 CONTROL "teindre la lumire en partant",IDC_AFTER_POWEROFF, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,85,110,12 - CTEXT "Note : en cas d'enregistrements simultans, ceci s'applique au dernier enregistrement stopp.",IDC_AFTER_NOTE,37,98,159,16 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,86,110,12 + CTEXT "Note: en cas d'enregistrements simultans, ceci s'applique au dernier enregistrement termin.",IDC_AFTER_NOTE,37,99,159,16 PUSHBUTTON "Nouveau",IDC_NEW,240,7,53,14,WS_GROUP PUSHBUTTON "mission en cours",IDC_CURRENT_PROGRAM,240,24,53,20,BS_MULTILINE PUSHBUTTON "Ajouter",IDC_ADD,240,52,53,14 @@ -342,13 +348,13 @@ PUSHBUTTON "Supprimer",IDC_REMOVE,240,86,53,14 DEFPUSHBUTTON "Fermer",IDOK,240,107,53,14 GROUPBOX "Rpter tous les",IDC_REPETITIONS,7,120,286,22,WS_DISABLED - CONTROL "Lundi",IDC_REP_LUNDI,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,14,130,32,10 - CONTROL "Mardi",IDC_REP_MARDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,47,130,30,10 - CONTROL "Mercredi",IDC_REP_MERCREDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,81,130,39,10 - CONTROL "Jeudi",IDC_REP_JEUDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126,130,32,10 - CONTROL "Vendredi",IDC_REP_VENDREDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,130,44,10 - CONTROL "Samedi",IDC_REP_SAMEDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,205,130,36,10 - CONTROL "Dimanche",IDC_REP_DIMANCHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,245,130,46,10 + CONTROL "Lundi",IDC_REP_LUNDI,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,14,131,32,8 + CONTROL "Mardi",IDC_REP_MARDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,47,131,30,8 + CONTROL "Mercredi",IDC_REP_MERCREDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,81,131,39,8 + CONTROL "Jeudi",IDC_REP_JEUDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126,131,32,8 + CONTROL "Vendredi",IDC_REP_VENDREDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,131,44,8 + CONTROL "Samedi",IDC_REP_SAMEDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,205,131,36,8 + CONTROL "Dimanche",IDC_REP_DIMANCHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,245,131,46,8 CONTROL "",IDC_LIST_PROGRAMMES,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_GROUP,0,145,300,109 END @@ -369,7 +375,7 @@ FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN RTEXT "Chane enregistre :",IDC_STATIC,7,9,70,8 - COMBOBOX IDC_RECORD,83,7,76,37,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_CHANNEL,83,7,76,37,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Temporisation active",IDC_DELAY_ACTIVE,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,14,24,138,10 CONTROL "",IDC_DELAYED_STOP,"SysDateTimePick32",DTS_UPDOWN | WS_GROUP | WS_TABSTOP | 0x8,7,38,48,12 LTEXT "hh:mm:ss",IDC_DELAY_LABEL,9,51,36,10 @@ -379,7 +385,7 @@ CONTROL "Fermer Pouchin TV Mod",IDC_AFTER,"Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_GROUP | WS_TABSTOP,14,73,138,10 CONTROL "teindre la lumire en partant",IDC_AFTER_POWEROFF, "Button",BS_AUTOCHECKBOX | BS_TOP | WS_TABSTOP,14,84,138,10 - LTEXT "Note : en cas d'enregistrements simultans, ceci s'applique au dernier enregistrement stopp.",IDC_AFTER_NOTE,30,97,106,27 + LTEXT "Note : en cas d'enregistrements simultans, ceci s'applique au dernier enregistrement termin.",IDC_AFTER_NOTE,30,97,106,27 DEFPUSHBUTTON "OK",IDOK,7,127,46,14,WS_GROUP PUSHBUTTON "Appliquer",IDC_APPLY,60,127,46,14,WS_DISABLED PUSHBUTTON "Annuler",IDCANCEL,113,127,46,14 @@ -561,7 +567,7 @@ VERTGUIDE, 7 VERTGUIDE, 562 TOPMARGIN, 7 - BOTTOMMARGIN, 292 + BOTTOMMARGIN, 305 END IDD_SIGNAL, DIALOG Modifié: trunk/resource.h =================================================================== --- trunk/resource.h 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/resource.h 2009-12-18 11:47:45 UTC (rev 214) @@ -45,6 +45,7 @@ #define IDC_SIGNAL_STRENGTH_BAR 1013 #define IDC_SIGNAL_QUALITY 1014 #define IDC_SIGNAL_QUALITY_BAR 1015 +#define IDC_RECORD 1016 #define IDC_LIST_EPG 1017 #define IDC_RESET_EPG 1018 #define IDC_MOTIF_NOM_REC 1019 @@ -68,9 +69,10 @@ #define IDC_SCREENSHOTS_DIR 1046 #define IDC_CHANNEL 1047 #define IDC_NAME 1048 -#define IDC_RECORD 1049 -#define IDC_INACTIVE 1050 -#define IDC_METHOD 1052 +#define IDC_INACTIVE 1049 +#define IDC_METHOD_S 1050 +#define IDC_METHOD 1051 +#define IDC_AUDIO_S 1052 #define IDC_AUDIO 1053 #define IDC_SIGNAL_ZERO 1054 #define IDC_SIGNAL_ZERO_UPDOWN 1055 @@ -87,6 +89,7 @@ #define IDC_AVANCE_ENREG_UPDOWN 1071 #define IDC_RETARD_ENREG 1072 #define IDC_RETARD_ENREG_UPDOWN 1073 +#define IDC_ALLOW_STREAM_RECORD 1075 #define IDC_SCAN 1080 #define IDC_RENUMBER 1081 #define IDC_RENUM_SEQ 1082 @@ -136,7 +139,6 @@ #define IDC_TUNER_OFFSET 1140 #define IDC_TUNER_OFFSET_UPDOWN 1141 -// #define IDC_TUNER_ALIGN_EVEN 1142 #define IDC_TRY_PLUS5KHZ 1142 #define IDC_SCAN_DELAY1 1143 #define IDC_SCAN_DELAY1_UPDOWN 1144 @@ -161,8 +163,6 @@ #define IDC_SUSPEND 1170 #define IDC_SYSTEM_TRAY 1171 #define IDC_AUTO_RETUNE 1172 -#define IDC_AC3_DEF 1173 -#define IDC_ALLOW_STREAM_RECORD 1174 #define IDC_COMBO_RENDERING 1180 #define IDC_USE_OSD 1181 #define IDC_USE_OSD_S 1182 Modifié: trunk/settings.cpp =================================================================== --- trunk/settings.cpp 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/settings.cpp 2009-12-18 11:47:45 UTC (rev 214) @@ -32,7 +32,7 @@ #include "parse.h" #include "search.h" #include "trayicon.h" - +#include "recprog.h" // pour remplit_liste_audio #include #include @@ -218,10 +218,29 @@ **/ inline bool get_check(HWND hDlg, int nID) { - return IsDlgButtonChecked(hDlg, nID)==BST_CHECKED; + return IsDlgButtonChecked(hDlg, nID) == BST_CHECKED; } /** + * Recherche, parmi une suite de boutons radio, lequel est slectionn + * + * \param[in] hDlg handle de la boite de dialogue contenant l'lment cocher + * \param[in] nFirstID identifiant du premier bouton tester + * \param[in] nLastID identifiant du dernier bouton tester + * \param[in] nDefault valeur (rang) par dfaut, si aucun n'est trouv coch + * \param[in] nBase base de numrotation (1er item) de la valeur retourne + * \retval rang du bouton coch, base \p nBase + **/ +static int get_radio_check(HWND hDlg, int nFirstID, int nLastID, int nDefault, int nBase = 0) +{ + for (int nID = nFirstID; nID <= nLastID; ++nID) { + if (IsDlgButtonChecked(hDlg, nID) == BST_CHECKED) + return nID-nFirstID+nBase; + } + return nDefault; +} + +/** * Extraction d'une valeur "int" d'un item texte de dialogue, si son contenu est valide * * \param[in] hDlg handle de la boite de dialogue contenant l'lment cocher @@ -546,8 +565,8 @@ * Fonction utilise pour trier la liste des chanes * * \param[in] lParam1 index du permier lment - * \param[in] lParam2 index du secon lment - * \param[in] lParamSort paramtres de trie + * \param[in] lParam2 index du second lment + * \param[in] lParamSort paramtres de tri * \retval <0 lParam1 < lParam2 * \retval 0 lParam1 = lParam2 * \retval >0 lParam1 > lParam2 @@ -1138,7 +1157,7 @@ } break; - case LVN_COLUMNCLICK: // Clic sur la colonne => tri les chanes + case LVN_COLUMNCLICK: // Clic sur la colonne => tri des chanes if (wParam==IDC_CHANNEL_LIST) { // Tri de la liste par clic sur un en-tte de colonne : static BOOL tblSortDir[_countof(t_cols)] = {0}; @@ -1915,14 +1934,8 @@ scan_ignore_presence = get_check(hDlg, IDC_SCAN_IGNORE_PRESENCE); scan_ignore_lock = get_check(hDlg, IDC_SCAN_IGNORE_LOCK); scan_ignore_quality = get_check(hDlg, IDC_SCAN_IGNORE_QUALITY); - - if (get_check(hDlg, IDC_SCAN_FULL)) - methode_recherche = sm_full; - else if (get_check(hDlg, IDC_SCAN_INCREMENTAL)) - methode_recherche = sm_incremental; - else - methode_recherche = sm_prefs; - + methode_recherche = (SearchMethod)get_radio_check(hDlg, + IDC_SCAN_INCREMENTAL, IDC_SCAN_FULL, sm_prefs, sm_incremental); use_offsets = (OffsetsToUse)SendDlgItemMessage(hDlg, IDC_SCAN_OFFSETS, CB_GETCURSEL, 0, 0); @@ -2734,20 +2747,20 @@ { // Nom et largeur des diffrentes colonnes static const struct Tab_cols t_cols[] = { - {TEXT("Action"), 210}, - {TEXT("Raccourci"), 90}, - {TEXT("Alternatif"), 90}, - {NULL, 0} // Terminateur + {TEXT("Action"), 210}, + {TEXT("Raccourci"), 90}, + {TEXT("Alternatif"), 90}, + {NULL, 0} // Terminateur }; - int i; // Itrateur - TCHAR szRaccourci[32]; // Raccourci en toute lettres + int i; //!< Itrateur + TCHAR szRaccourci[32]; //!< Raccourci en toute lettres - static HHOOK hhook = 0;// Handle du hook - static int iItem; // Numro de la ligne modifie - static int iColonne; // Numro de la colonne modifi - static HWND hList = 0;// Handle de la liste - static int dx = 0;// Position du scrolling horizontal - static int dy = 0;// Position du scrolling vertical + static HHOOK hHook = NULL; //!< Handle du hook + static int iItem; //!< Numro de la ligne modifie + static int iColonne; //!< Numro de la colonne modifi + static HWND hList = NULL; //!< Handle de la liste + static int dx = 0; //!< Position du scrolling horizontal + static int dy = 0; //!< Position du scrolling vertical switch (uMsg) { @@ -2845,10 +2858,9 @@ } // switch(wParam) return FALSE; - case WM_NOTIFY: { - LPNMITEMACTIVATE p = (LPNMITEMACTIVATE)lParam; + case WM_NOTIFY: + switch (_ncode_(lParam)) { - switch (_ncode_(lParam)) { case PSN_APPLY: // Application des changements save_config_raccourcis(); load_config_raccourcis(); @@ -2858,9 +2870,9 @@ inversion_molette = get_check(hDlg, IDC_WHEEL_INVERT); return psn_result(hDlg, PSNRET_NOERROR); - case PSN_KILLACTIVE:{ // Validation des changements + case PSN_KILLACTIVE: { // Validation des changements bool valide = true; - int count = get_shortcuts_count(); + int count = get_shortcuts_count(); for (i=0; i(lParam); - if (hhook == 0 && p->hdr.idFrom == IDC_SHORTCUT) { - // Notification envoye de la liste des raccourcis - if (p->hdr.code == NM_DBLCLK) { // Double clic sur un raccourci - if (p->iItem >= 0) { + if (sNmIa.iItem >= 0) { // On rcupre le raccourci slectionn LVHITTESTINFO lvhti = { - p->ptAction // pt + sNmIa.ptAction // pt + // Le reste zro (implicite) }; + ListView_SubItemHitTest(hList, &lvhti); // On ne fait rien si on n'est pas dans la seconde/troisime colonne @@ -2910,29 +2924,33 @@ ListView_SetItem(hList, &item); // On met un hook sur le clavier pour capturer les touches - hhook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hAppInstance, NULL); + hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hAppInstance, NULL); EnableWindow(hDlg, false); } } - } else if (p->hdr.code == LVN_ENDSCROLL) { - // On a descendu le scroll - NMLVSCROLL *scroll = (NMLVSCROLL*)lParam; - dx += scroll->dx; - dy += scroll->dy; } - } - return FALSE;} + break; + case LVN_ENDSCROLL: { + // On a descendu le scroll + const NMLVSCROLL & sNmLs = *reinterpret_cast(lParam); + + dx += sNmLs.dx; + dy += sNmLs.dy; } + } // switch (_ncode_(lParam)) + + return FALSE; + case WM_APP_HOOK_OK:{ - bool remplacer = true; - Raccourci * param = (Raccourci*)wParam; - ShortcutItem & item = shortcuts[iItem]; - int count = get_shortcuts_count(); + bool remplacer = true; + const Raccourci * param = reinterpret_cast(wParam); + ShortcutItem & item = shortcuts[iItem]; + int count = get_shortcuts_count(); for (i=0; imaj; - item.raccourci.ctrl = param->ctrl; - item.raccourci.alt = param->alt; - item.raccourci.touche = param->touche; - } else { - item.alternatif.maj = param->maj; - item.alternatif.ctrl = param->ctrl; - item.alternatif.alt = param->alt; - item.alternatif.touche = param->touche; - } + if (remplacer) { + if (iColonne == 1) + item.raccourci = *param; + else + item.alternatif = *param; + } delete param; // On vrifie si un raccourci n'est pas attribu @@ -2977,32 +2989,35 @@ remplit_liste_shorcut(hList, dx, dy); case WM_DESTROY: - if (hhook) { + if (hHook) { // On lve le Hook plac EnableWindow(hDlg, true); - UnhookWindowsHookEx(hhook); - hhook = 0; + UnhookWindowsHookEx(hHook); + hHook = NULL; } return 0; case WM_CONTEXTMENU:{ // On a effectu un clic avec le bouton droit (menu contextuel) // Rcupre la position de la souris par rapport la fentre - POINT pt; + POINT pt; + GetCursorPos(&pt); - LVHITTESTINFO lvhti = { + + LVHITTESTINFO lvhti = { pt // le reste zro (implicite) }; + ScreenToClient(hList, &lvhti.pt); if (ListView_SubItemHitTest(hList, &lvhti)>=0 && (lvhti.iSubItem==SHORT_COL_RACCOURCIS || lvhti.iSubItem == SHORT_COL_ALTERNATIF)) { // Permet de modifier les raccourcis // Mmorise la case modifier - iItem = lvhti.iItem; // Ligne traiter + iItem = lvhti.iItem; // Ligne traiter iColonne = lvhti.iSubItem; // Colonne traiter - HMENU pop = CreatePopupMenu(); - TCHAR buffer[128]; + HMENU pop = CreatePopupMenu(); + TCHAR buffer[128]; shortcuts[iItem].defaut.ToString(szRaccourci); _stprintf_s(buffer, TEXT("Valeur par &dfaut: %s"), szRaccourci); @@ -3083,7 +3098,7 @@ set_check(hDlg, IDC_SUSPEND, suspend_minimized); set_check(hDlg, IDC_SYSTEM_TRAY, minimize_system_tray); - set_check(hDlg, IDC_AC3_DEF, use_ac3); + remplit_liste_audio(GetDlgItem(hDlg, IDC_AUDIO), audio_pref); // Mthodes de rendu vido : SetVMRSel(hDlg, vmr_mode); @@ -3120,7 +3135,7 @@ // ... Passage travers case _cmd_(IDC_SUSPEND, BN_CLICKED): case _cmd_(IDC_SYSTEM_TRAY, BN_CLICKED): - case _cmd_(IDC_AC3_DEF, BN_CLICKED): + case _cmd_(IDC_AUDIO, CBN_SELCHANGE): case _cmd_(IDC_USE_OSD, BN_CLICKED): case _cmd_(IDC_MSN, BN_CLICKED): case _cmd_(IDC_ALLOW_STREAM_RECORD, BN_CLICKED): @@ -3172,7 +3187,7 @@ suspend_minimized = get_check(hDlg, IDC_SUSPEND); minimize_system_tray = get_check(hDlg, IDC_SYSTEM_TRAY); - use_ac3 = get_check(hDlg, IDC_AC3_DEF); + audio_pref = (AudioMode)SendDlgItemMessage(hDlg, IDC_AUDIO, CB_GETCURSEL, 0, 0); vmr_mode = GetVMRSel(hDlg); use_osd = get_check(hDlg, IDC_USE_OSD); use_msn = get_check(hDlg, IDC_MSN); Modifié: trunk/tools/GeneRealVersion/GeneRealVersion_2005.vcproj =================================================================== --- trunk/tools/GeneRealVersion/GeneRealVersion_2005.vcproj 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/tools/GeneRealVersion/GeneRealVersion_2005.vcproj 2009-12-18 11:47:45 UTC (rev 214) @@ -133,7 +133,7 @@ Name="VCLinkerTool" OutputFile="..\$(ProjectName).exe" LinkIncremental="1" - GenerateDebugInformation="true" + GenerateDebugInformation="false" SubSystem="1" OptimizeReferences="2" EnableCOMDATFolding="2" Modifié: trunk/tools/GeneRealVersion/GeneRealVersion_2008.vcproj =================================================================== --- trunk/tools/GeneRealVersion/GeneRealVersion_2008.vcproj 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/tools/GeneRealVersion/GeneRealVersion_2008.vcproj 2009-12-18 11:47:45 UTC (rev 214) @@ -133,7 +133,7 @@ Name="VCLinkerTool" OutputFile="..\$(ProjectName).exe" LinkIncremental="1" - GenerateDebugInformation="true" + GenerateDebugInformation="false" SubSystem="1" OptimizeReferences="2" EnableCOMDATFolding="2" Modifié: trunk/tools/GeneRealVersion/main.c =================================================================== --- trunk/tools/GeneRealVersion/main.c 2009-12-05 01:55:42 UTC (rev 213) +++ trunk/tools/GeneRealVersion/main.c 2009-12-18 11:47:45 UTC (rev 214) @@ -151,12 +151,12 @@ if (fp) { fprintf_s(fp, "#define PTVM_VERSION_STR \"%s%s\"\n", // Si version 3 chiffres, l'tat "modifi" est matrialis - szOutBuff, modifie && nComma > 1 ? "M" : ""); // par un "M" la fin de la chane de caractres + szOutBuff, modifie && nComma > 1 ? "+" : ""); // par un "+" la fin de la chane de caractres fclose(fp); } // Affiche la version sur la sortie standard fprintf_s(stdout, "%s%s%s", argc>=4 && argv[3] ? argv[3]:"", - szOutBuff, modifie && nComma > 1 ? "M" : ""); + szOutBuff, modifie && nComma > 1 ? "+" : ""); return 0; } Modifié: trunk/tools/GeneRealVersion.exe =================================================================== (les fichiers binaires diffèrent) From pouchintv-dev at baysse.fr Fri Dec 18 18:50:24 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Fri, 18 Dec 2009 17:50:24 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r215 - trunk Message-ID: <20091218175018.02B645F76D@mail.baysse.fr> Author: gingko Date: 2009-12-18 18:50:17 +0100 (ven 18 déc 2009) New Revision: 215 Modified: trunk/changelog.html trunk/channels.cpp trunk/main.cpp trunk/recprog.cpp trunk/res.rc trunk/resource.h trunk/version trunk/version.rc2 Log: Version 0.6 ; réorganisation des menus, modification du dialogue des enregistrements programmés. res.rc, main.cpp, channels.cpp : * Les menus de l'application sont réorganisés, selon la nouvelle structure "Fichiers", "Chaînes", "Vidéo", "Audio", "Information" "Enregistrer", "Options", "Aide". * L'ancien menu "Commandes" est maintenant réparti dans les menus "Vidéo" et "Audio". * L'ancien menu des "Filtres" est maintenant un sous-menu du menu "Options". * L'ancien menu des "Pistes" est maintenant la partie inférieur du menu "Audio". res.rc, recprog.cpp, resource.h : * Ajout de deux boutons "-24h" et "+24h" dans le dialogue des enregistrements programmés, pour permettre de décaler rapidement de 24h une programmation existante ou en construction. * La liste des enregistrements est colorisée (enregistrements en attente en bleu, enregistrements en cours en rouge, enregistrements terminés ou désactivés en gris, enregistrement supplantés ou en erreur en violet. version, version.rc2 : * Mise en place du nouveau plan de numérotation, selon lequel : - Le 1er chiffre est le numéro majeur - Le 2nd chiffre est le numéro mineur - Le 3ème chiffre est le numéro de révision. Ce chiffre sera dorénavant pair pour les versions officiellement publiées du logiciel, et impair pour les versions intermédiaires, expérimentales ou beta. - Le 4ème chiffre est le numéro de publications des sources dans le dépôt SVN. Ce chiffre peut être suffixé d'un "+" dans le cas d'une compilation locale dont les sources ne sont pas (encore) publiés. * Le numéro de version passe à 0.6.0.xxx, selon ce plan de numérotation. * Un suffixe "RC" (release candidate) est ajouté temporairement. Modifié: trunk/changelog.html =================================================================== --- trunk/changelog.html 2009-12-18 11:47:45 UTC (rev 214) +++ trunk/changelog.html 2009-12-18 17:50:17 UTC (rev 215) @@ -24,6 +24,7 @@
            +

            Changements réalisés pour la version 0.6

            + +
            +
            SVN rév. 215 :
            +
              +
            • Les menus de l'application sont réorganisés, selon la nouvelle structure Fichiers, + Chaînes, Vidéo, Audio, Information, Enregistrer, + Options et Aide.
            • +
            • Ajout de deux boutons -24h et +24h dans le dialogue des enregistrements + programmés, pour permettre de décaler rapidement de 24h une programmation existante + ou en construction.
            • +
            • Ajout de couleurs dans la liste des enregistrements programmés, en correspondance avec + l'état des programmations.
            • +
            • Mise en place d'un nouveau système de numérotation des versions, selon lequel :
                +
              • Le 1er et le 2nd chiffre sont les numéros majeur et mineur.
              • +
              • Le 3ème chiffre est le numéro de révision. Ce chiffre sera pair pour les + versions publiées, et impair pour les versions intermédiaires, expérimentales ou beta.
              • +
              • Le 4ème chiffre est le numéro de publications des sources dans le dépot SVN. + Ce chiffre peut être suffixé d'un "+" dans le cas d'une compilation locale dont les sources + ne sont pas (encore) publiés.
            • +
            +
            +
            + +

            Retour

            +
            + +

            Changements réalisés pour la version 0.5

            Modifié: trunk/channels.cpp =================================================================== --- trunk/channels.cpp 2009-12-18 11:47:45 UTC (rev 214) +++ trunk/channels.cpp 2009-12-18 17:50:17 UTC (rev 215) @@ -221,7 +221,7 @@ strcpy_T(szLangue, son_courant.lang); return _stprintf_s(pstr, bufSize, - TEXT("Audio %i : %") A2t TEXT(" (%") A2t TEXT(")"), nTrack+1, szLangue, + TEXT("Piste %i : %") A2t TEXT(" (%") A2t TEXT(")"), nTrack+1, szLangue, son_courant.type >= tst_Audio_END ? "???" : tblNomsAudio[son_courant.type]); } Modifié: trunk/main.cpp =================================================================== --- trunk/main.cpp 2009-12-18 11:47:45 UTC (rev 214) +++ trunk/main.cpp 2009-12-18 17:50:17 UTC (rev 215) @@ -58,7 +58,7 @@ * Texte de version de l'application **/ TCHAR szAppVersion[] = - TEXT(PTVM_VERSION_STR) TEXT(" (") + TEXT(PTVM_VERSION_STR) TEXT( PTVM_VERSION_SUFFIX) TEXT(" (") #ifdef _WIN64 TEXT("x64") #else @@ -113,13 +113,14 @@ // Positions des sous-menus du menu principal : #define MENU_FICHIER_POSITION 0 -#define MENU_FILTRES_POSITION 1 -#define MENU_COMMANDES_POSITION 2 -#define MENU_CHAINES_POSITION 3 -#define MENU_PISTES_POSITION 4 -#define MENU_CAPTURES_POSITION 5 -#define MENU_PROGRAMME_POSITION 6 -#define SMENU_PRIORITE_POSITION 2 // dans menu "Programme" +#define MENU_CHAINES_POSITION 1 +#define MENU_VIDEO_POSITION 2 +#define MENU_AUDIO_POSITION 3 +#define SMENU_PISTES_POSITION 4 // base pistes dans menu "Audio" +#define MENU_INFORMATION_POSITION 4 +#define MENU_ENREGISTRER_POSITION 5 +#define MENU_OPTIONS_POSITION 6 +#define SMENU_PRIORITE_POSITION 3 // dans menu "Options" WinVersion eWinVers = wv_Unknown; //!< Version de Windows (dcodage basique) @@ -357,7 +358,8 @@ // On vrifie que l'entre n'existe pas if (!mi_exists) { // Slectionne le menu "Priorits" - HMENU hMenuPriorite = GetSubMenu(GetSubMenu(hMenu, MENU_PROGRAMME_POSITION), SMENU_PRIORITE_POSITION); + HMENU hMenuPriorite = GetSubMenu(GetSubMenu(hMenu, MENU_OPTIONS_POSITION), SMENU_PRIORITE_POSITION); + // Ajoute l'entre dans le menu AppendMenu(hMenuPriorite, MF_CHECKED, IDM_IDLE_PRIORITY, TEXT("Basse")); } @@ -439,7 +441,7 @@ static void update_menu_recording(HMENU hMenu) { - HMENU hRecMenu = GetSubMenu(hMenu, MENU_CAPTURES_POSITION); + HMENU hRecMenu = GetSubMenu(hMenu, MENU_ENREGISTRER_POSITION); int ixRecDescr = enregistrements_actuels.getRecordingDescr(ixChaineCourante); bool curChannelRecording = ixRecDescr != -1; bool bFreeRecAvailable = enregistrements_actuels.getFreeDescriptor() != -1; @@ -509,24 +511,19 @@ return; const Chaine & canal_courant = Canaux[ixChaineCourante]; - TCHAR nom_menu[64]; + HMENU hAudio = GetSubMenu(hMenu, MENU_AUDIO_POSITION); - // Rcupre le nom du menu avant de l'effacer - GetMenuString(hMenu, MENU_PISTES_POSITION, - nom_menu, _countof(nom_menu), MF_BYPOSITION); - DeleteMenu(hMenu, MENU_PISTES_POSITION, MF_BYPOSITION); + // Dtruire les items de pistes audio antrieurs, s'ils existent + while (DeleteMenu(hAudio, SMENU_PISTES_POSITION, MF_BYPOSITION)); - HMENU pistes = CreatePopupMenu(); - + // Insrer les nouveaux items de pistes audio for (int i=0; iwVKey == VK_DELETE) SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDC_REMOVE, 0), 0); + } else if (_ncode_(lParam)==NM_CUSTOMDRAW) { + NMLVCUSTOMDRAW & sNlcd = *reinterpret_cast(lParam); + + switch(sNlcd.nmcd.dwDrawStage) { + + case CDDS_PREPAINT: + SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW); + return TRUE; + + case CDDS_ITEMPREPAINT: { + const Programme & prog = Programmes[sNlcd.nmcd.dwItemSpec]; + + switch (prog.etat) { + + case epr_actif: + sNlcd.clrText = RGB(0,128,255); + break; + + case epr_encours: + sNlcd.clrText = RGB(255,0,0); + break; + + case epr_interrompu: + case epr_termine: + case epr_inactif: + sNlcd.clrText = RGB(128,128,128); + break; + + case epr_supplante: + case epr_erreur: + sNlcd.clrText = RGB(128,0,128); + } + return TRUE; } + } } break; @@ -1188,6 +1222,24 @@ case WM_COMMAND: switch(LOWORD(wParam)) { + case IDC_ADD_24: // Ajouter 24h des deux cts + GetCtlTimeDate(hDlg, IDC_DATE_START, IDC_TIME_START, dtc_debut); + AddTime(dtc_debut, 24 * 60 * 60 * 1000); + SetCtlTimeDate(hDlg, IDC_DATE_START, IDC_TIME_START, dtc_debut); + GetCtlTimeDate(hDlg, IDC_DATE_END, IDC_TIME_END, dtc_fin); + AddTime(dtc_fin, 24 * 60 * 60 * 1000); + SetCtlTimeDate(hDlg, IDC_DATE_END, IDC_TIME_END, dtc_fin); + break; + + case IDC_SUB_24: // Soustraire 24h des deux cts + GetCtlTimeDate(hDlg, IDC_DATE_START, IDC_TIME_START, dtc_debut); + AddTime(dtc_debut, -24 * 60 * 60 * 1000); + SetCtlTimeDate(hDlg, IDC_DATE_START, IDC_TIME_START, dtc_debut); + GetCtlTimeDate(hDlg, IDC_DATE_END, IDC_TIME_END, dtc_fin); + AddTime(dtc_fin, -24 * 60 * 60 * 1000); + SetCtlTimeDate(hDlg, IDC_DATE_END, IDC_TIME_END, dtc_fin); + break; + case IDC_METHOD: case IDC_AUDIO: if (HIWORD(wParam) == CBN_SELCHANGE) { Modifié: trunk/res.rc =================================================================== --- trunk/res.rc 2009-12-18 11:47:45 UTC (rev 214) +++ trunk/res.rc 2009-12-18 17:50:17 UTC (rev 215) @@ -66,70 +66,73 @@ BEGIN POPUP "&Fichier" BEGIN - MENUITEM "&Configuration", IDM_CONFIG + MENUITEM "&Capture d'cran", IDM_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Quitter", IDM_QUIT END - POPUP "Fi<res" + MENUITEM "&Chanes", IDM_CHAINES + POPUP "&Vido" BEGIN - MENUITEM "Codec vido &MPEG2", IDM_MP2V - MENUITEM "C&odec vido H264", IDM_H264 - MENUITEM "Codec a&udio MPEG2", IDM_MP2A - MENUITEM "Codec audio &AC3", IDM_AC3 - MENUITEM "Codec audio &EAC3", IDM_EAC3 + MENUITEM "&Zoomer", IDM_ZOOM + MENUITEM "Dz&oomer", IDM_DEZOOM + MENUITEM "Zoom par &dfaut", IDM_DEFAULT_ZOOM + MENUITEM "Utiliser toute la &largeur", IDM_ALLWDT + MENUITEM "Utiliser toute la &hauteur", IDM_ALLHGT + MENUITEM "tir&er la vido", IDM_ETIRER MENUITEM SEPARATOR - MENUITEM "&Rendu vido", IDM_VMR - MENUITEM "Rendu &audio", IDM_DSOUND - MENUITEM SEPARATOR - MENUITEM "&Dmultiplexeur", IDM_DEMUX + MENUITEM "&Plein cran", IDM_FULLSCREEN END - POPUP "C&ommandes" + POPUP "&Audio" BEGIN - MENUITEM "Z&oomer", IDM_ZOOM - MENUITEM "D&zoomer", IDM_DEZOOM - MENUITEM "&Utiliser toute la largeur", IDM_ALLWDT - MENUITEM "Utiliser toute la &hauteur", IDM_ALLHGT - MENUITEM "tirer la &vido", IDM_ETIRER - MENUITEM SEPARATOR - MENUITEM "Zoom par &dfaut", IDM_DEFAULT_ZOOM - MENUITEM SEPARATOR MENUITEM "Couper le &son", IDM_MUTE MENUITEM "&Augmenter le volume", IDM_VOL_AUG MENUITEM "&Diminuer le volume", IDM_VOL_DIM + MENUITEM SEPARATOR END - MENUITEM "C&hanes", IDM_CHAINES - MENUITEM "&Pistes", IDM_PISTES - POPUP "&Captures" + POPUP "&Information" BEGIN + MENUITEM "&Guide des programmes", IDM_EPG + MENUITEM "&Qualit du signal", IDM_SIGNAL + END + POPUP "&Enregistrer" + BEGIN MENUITEM "Enregistrements p&rogramms", IDM_DELAYED_RECORD MENUITEM "Enregistrer la chane en &PS", IDM_RECORD_CHANNEL_PS MENUITEM "Enregistrer la chane en &TS", IDM_RECORD_CHANNEL_TS MENUITEM SEPARATOR MENUITEM "&Arrter l'enregistrement", IDM_STOP_RECORD MENUITEM "Arrter l'enregistrement &dans", IDM_DELAYED_STOP - MENUITEM SEPARATOR - MENUITEM "&Capture d'cran", IDM_SCREENSHOT END - POPUP "Pro&gramme" + POPUP "&Options" BEGIN - MENUITEM "Rester toujours &devant", IDM_ALWAYS_ON_TOP - MENUITEM "&Plein cran", IDM_FULLSCREEN - POPUP "&Changer la priorit" + MENUITEM "&Configuration", IDM_CONFIG + MENUITEM SEPARATOR + POPUP "&Filtres" BEGIN + MENUITEM "Codec vido &MPEG2", IDM_MP2V + MENUITEM "Codec vido &H264", IDM_H264 + MENUITEM "Codec a&udio MPEG2", IDM_MP2A + MENUITEM "Codec audio A&C3", IDM_AC3 + MENUITEM "Codec audio &EAC3", IDM_EAC3 + MENUITEM SEPARATOR + MENUITEM "&Rendu vido", IDM_VMR + MENUITEM "Rendu &audio", IDM_DSOUND + MENUITEM SEPARATOR + MENUITEM "&Dmultiplexeur", IDM_DEMUX + END + POPUP "Changer la &priorit" + BEGIN MENUITEM "Temps &rel", IDM_REALTIME_PRIORITY MENUITEM "&Haute", IDM_HIGH_PRIORITY MENUITEM "&Suprieure la normale", IDM_ABOVE_NORMAL_PRIORITY MENUITEM "&Normale", IDM_NORMAL_PRIORITY MENUITEM "&Infrieure la normale", IDM_BELOW_NORMAL_PRIORITY END - MENUITEM SEPARATOR - MENUITEM "&Guide des programmes", IDM_EPG - MENUITEM SEPARATOR - MENUITEM "&Qualit du signal", IDM_SIGNAL + MENUITEM "Rester toujours &devant", IDM_ALWAYS_ON_TOP END - POPUP "&Aide" + POPUP "Ai&de" BEGIN - MENUITEM "Vrifier les &mises jour", IDM_UPDATE + MENUITEM "&Vrifier les &mises jour", IDM_UPDATE MENUITEM " &propos", IDM_ABOUT END END @@ -314,7 +317,7 @@ DEFPUSHBUTTON "Fermer",IDOK,55,111,54,15 END -IDD_DELAYED_RECORD DIALOGEX 100, 100, 300, 254 +IDD_DELAYED_RECORD DIALOGEX 100, 100, 346, 254 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Enregistrements programms" FONT 8, "MS Shell Dlg", 400, 0, 0x1 @@ -322,40 +325,42 @@ LTEXT "Dbut de l'enregistrement :",IDC_STATIC,7,6,100,8 CONTROL "",IDC_DATE_START,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,7,15,56,12 CONTROL "",IDC_TIME_START,"SysDateTimePick32",DTS_UPDOWN | WS_TABSTOP | 0x8,67,15,49,12 - LTEXT "Fin de l'enregistrement :",IDC_STATIC,123,6,100,8 - CONTROL "",IDC_DATE_END,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,124,15,56,12 - CONTROL "",IDC_TIME_END,"SysDateTimePick32",DTS_UPDOWN | WS_TABSTOP | 0x8,184,15,49,12 + PUSHBUTTON "-24h",IDC_SUB_24,120,15,22,12 + PUSHBUTTON "+24h",IDC_ADD_24,146,15,22,12 + LTEXT "Fin de l'enregistrement :",IDC_STATIC,172,6,100,8 + CONTROL "",IDC_DATE_END,"SysDateTimePick32",DTS_RIGHTALIGN | WS_TABSTOP,172,15,56,12 + CONTROL "",IDC_TIME_END,"SysDateTimePick32",DTS_UPDOWN | WS_TABSTOP | 0x8,232,15,49,12 LTEXT "Chane:",IDC_STATIC,7,28,56,8 - COMBOBOX IDC_CHANNEL,7,37,109,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Mthode:",IDC_STATIC,124,28,50,8 - COMBOBOX IDC_METHOD,124,37,50,18,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Piste audio:",IDC_STATIC,177,28,56,8 - COMBOBOX IDC_AUDIO,177,37,56,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Nom de l'enregistrement:",IDC_STATIC,14,53,89,12,SS_CENTERIMAGE - EDITTEXT IDC_NAME,99,53,134,12,ES_AUTOHSCROLL + COMBOBOX IDC_CHANNEL,7,37,116,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Mthode:",IDC_STATIC,142,28,56,8 + COMBOBOX IDC_METHOD,142,37,56,18,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Piste audio:",IDC_STATIC,217,28,64,8 + COMBOBOX IDC_AUDIO,217,37,64,12,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Nom de l'enregistrement:",IDC_STATIC,7,53,86,12,SS_CENTERIMAGE + EDITTEXT IDC_NAME,97,53,184,12,ES_AUTOHSCROLL CONTROL "Ajouter aux tches planifes de Windows",IDC_TACHE, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,14,69,153,8 - CONTROL "Dsactiv",IDC_INACTIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,184,69,49,8 - GROUPBOX "Aprs l'enregistrement :",IDC_AFTER_RECORD,7,78,226,40 + CONTROL "Dsactiv",IDC_INACTIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,232,69,49,8 + GROUPBOX "Aprs l'enregistrement :",IDC_AFTER_RECORD,7,78,274,40 CONTROL "Fermer Pouchin TV Mod",IDC_AFTER,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,14,86,102,13 CONTROL "teindre la lumire en partant",IDC_AFTER_POWEROFF, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,120,86,110,12 - CTEXT "Note: en cas d'enregistrements simultans, ceci s'applique au dernier enregistrement termin.",IDC_AFTER_NOTE,37,99,159,16 - PUSHBUTTON "Nouveau",IDC_NEW,240,7,53,14,WS_GROUP - PUSHBUTTON "mission en cours",IDC_CURRENT_PROGRAM,240,24,53,20,BS_MULTILINE - PUSHBUTTON "Ajouter",IDC_ADD,240,52,53,14 - PUSHBUTTON "Modifier",IDC_MODIFY,240,69,53,14 - PUSHBUTTON "Supprimer",IDC_REMOVE,240,86,53,14 - DEFPUSHBUTTON "Fermer",IDOK,240,107,53,14 - GROUPBOX "Rpter tous les",IDC_REPETITIONS,7,120,286,22,WS_DISABLED - CONTROL "Lundi",IDC_REP_LUNDI,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,14,131,32,8 - CONTROL "Mardi",IDC_REP_MARDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,47,131,30,8 - CONTROL "Mercredi",IDC_REP_MERCREDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,81,131,39,8 - CONTROL "Jeudi",IDC_REP_JEUDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126,131,32,8 - CONTROL "Vendredi",IDC_REP_VENDREDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,131,44,8 - CONTROL "Samedi",IDC_REP_SAMEDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,205,131,36,8 - CONTROL "Dimanche",IDC_REP_DIMANCHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,245,131,46,8 - CONTROL "",IDC_LIST_PROGRAMMES,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_GROUP,0,145,300,109 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,86,110,12 + CTEXT "Note: en cas d'enregistrements simultans, ceci s'applique au dernier enregistrement termin.",IDC_AFTER_NOTE,10,99,268,16 + PUSHBUTTON "Nouveau",IDC_NEW,285,7,53,14,WS_GROUP + PUSHBUTTON "mission en cours",IDC_CURRENT_PROGRAM,285,24,53,20,BS_MULTILINE + PUSHBUTTON "Ajouter",IDC_ADD,285,52,53,14 + PUSHBUTTON "Modifier",IDC_MODIFY,285,69,53,14 + PUSHBUTTON "Supprimer",IDC_REMOVE,285,86,53,14 + DEFPUSHBUTTON "Fermer",IDOK,285,107,53,14 + GROUPBOX "Rpter tous les",IDC_REPETITIONS,7,120,331,22,WS_DISABLED + CONTROL "Lundi",IDC_REP_LUNDI,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,15,131,32,8 + CONTROL "Mardi",IDC_REP_MARDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,57,131,30,8 + CONTROL "Mercredi",IDC_REP_MERCREDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,97,131,39,8 + CONTROL "Jeudi",IDC_REP_JEUDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,131,32,8 + CONTROL "Vendredi",IDC_REP_VENDREDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,188,131,44,8 + CONTROL "Samedi",IDC_REP_SAMEDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,242,131,36,8 + CONTROL "Dimanche",IDC_REP_DIMANCHE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,288,131,46,8 + CONTROL "",IDC_LIST_PROGRAMMES,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_GROUP | WS_TABSTOP,0,145,345,109 END IDD_PASWD DIALOGEX 100, 100, 150, 75 @@ -580,7 +585,7 @@ IDD_DELAYED_RECORD, DIALOG BEGIN - RIGHTMARGIN, 293 + RIGHTMARGIN, 339 VERTGUIDE, 7 TOPMARGIN, 7 END Modifié: trunk/resource.h =================================================================== --- trunk/resource.h 2009-12-18 11:47:45 UTC (rev 214) +++ trunk/resource.h 2009-12-18 17:50:17 UTC (rev 215) @@ -61,6 +61,8 @@ #define IDC_TIME_END 1031 #define IDC_LIST_PROGRAMMES 1032 #define IDC_CURRENT_PROGRAM 1033 +#define IDC_SUB_24 1035 +#define IDC_ADD_24 1036 #define IDC_WINDOW_TITLE 1039 #define IDC_MPEG2_DIR_VIEW 1043 @@ -254,6 +256,8 @@ #define IDM_BRANCHE 40094 // debug #define IDM_DEBRANCHE 40095 // debug +#define PTVM_VERSION_SUFFIX " RC" // temporaire + // Next default values for new objects // #ifdef APSTUDIO_INVOKED Modifié: trunk/version =================================================================== --- trunk/version 2009-12-18 11:47:45 UTC (rev 214) +++ trunk/version 2009-12-18 17:50:17 UTC (rev 215) @@ -1 +1 @@ -0,5 +0,6,0 Modifié: trunk/version.rc2 =================================================================== --- trunk/version.rc2 2009-12-18 11:47:45 UTC (rev 214) +++ trunk/version.rc2 2009-12-18 17:50:17 UTC (rev 215) @@ -22,12 +22,12 @@ BEGIN VALUE "Comments", "http://pouchintv.baysse.fr/, http://www.etud.insa-toulouse.fr/~mvelten/pouchintvmod/, http://pouchinteve.free.fr/" VALUE "FileDescription", "Pouchin TV Mod" - VALUE "FileVersion", PTVM_VERSION_STR + VALUE "FileVersion", PTVM_VERSION_STR PTVM_VERSION_SUFFIX VALUE "InternalName", "Pouchin TV Mod" VALUE "LegalCopyright", "Copyright (C) 2006, 2007, 2008, 2009" VALUE "OriginalFilename", "PouchinTVMod.exe" VALUE "ProductName", "Pouchin TV Mod" - VALUE "ProductVersion", PTVM_VERSION_STR + VALUE "ProductVersion", PTVM_VERSION_STR PTVM_VERSION_SUFFIX END END BLOCK "VarFileInfo" From pouchintv-dev at baysse.fr Sat Dec 19 01:58:07 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Sat, 19 Dec 2009 00:58:07 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r216 - trunk Message-ID: <20091219005759.A247D5F75D@mail.baysse.fr> Author: gingko Date: 2009-12-19 01:57:59 +0100 (sam 19 déc 2009) New Revision: 216 Modified: trunk/changelog.html trunk/channels.cpp trunk/channels.h trunk/epg.cpp trunk/main.cpp trunk/main.h Log: Améliorations dans la boîte de dialogue de l'EPG. epg.cpp, channels.h, channels.cpp, main.h, main.cpp : * Ajout de colorisations dans les rangées de la fenêtre EPG : - fond vert pour les émissions de la chaîne courante ; - fond jaune clair pour les émissions des chaînes diffusées sur le même multiplex que la chaîne courante ; - les émissions supposées être en cours de diffusion (selon leur horaire sont affichées avec le texte en bleu ; - les émissions en cours d'enregistrement sont affichées en texte rouge ; - les autres émissions sont affichées en gris. * Les couleurs y sont mises à jour en temps réel, au fil des changements de chaînes et des heures de début et de fin de chaque émission. * Toutes les colonnes peuvent y être triées (alternativement en ordre ascendant et descendant) en cliquant sur l'en-tête de la colonne concernée. Modifié: trunk/changelog.html =================================================================== --- trunk/changelog.html 2009-12-18 17:50:17 UTC (rev 215) +++ trunk/changelog.html 2009-12-19 00:57:59 UTC (rev 216) @@ -57,6 +57,21 @@

            Changements réalisés pour la version 0.6

            +
            0.6.0.216 RC (publiée dans le forum le 19 décembre 2009) :
            +
              +
            • Ajout de colorisations dans les rangées de la fenêtre EPG :
                +
              • fond vert pour les émissions de la chaîne courante ;
              • +
              • fond jaune clair pour les émissions des chaînes diffusées sur le même multiplex + que la chaîne courante ;
              • +
              • les émissions supposées être en cours de diffusion (selon leur horaire sont + affichées avec le texte en bleu ;
              • +
              • les émissions en cours d'enregistrement sont affichées en texte rouge ;
              • +
              • les autres émissions sont affichées en gris.
              +
            • Dans cette même fenêtre EPG, toutes les colonnes peuvent être triées (alternativement + en ordre ascendant et descendant) en cliquant sur l'en-tête de la colonne concernée.
            • +
            +
            +
            SVN rév. 215 :
            • Les menus de l'application sont réorganisés, selon la nouvelle structure Fichiers, @@ -74,7 +89,7 @@
            • Le 4ème chiffre est le numéro de publications des sources dans le dépot SVN. Ce chiffre peut être suffixé d'un "+" dans le cas d'une compilation locale dont les sources ne sont pas (encore) publiés.
            -
          +
        Modifié: trunk/channels.cpp =================================================================== --- trunk/channels.cpp 2009-12-18 17:50:17 UTC (rev 215) +++ trunk/channels.cpp 2009-12-19 00:57:59 UTC (rev 216) @@ -324,6 +324,22 @@ } /** + * Recherche, dans les informations d'une chane, de l'mission correspondant une cl d'mission donne + * + * \param[in] cleEmis Cl d'mission recherche + * \return Index de l'mission dans la liste, ou -1 si pas trouv + **/ +int Chaine::cherche_emis_par_cle(UINT64 cleEmis) const +{ + // Retrouver l'item qui a l'heure de dbut qui nous intresse + for (int ixEmi = 0; ixEmi<_countof(emis); ++ixEmi) { + if (emis[ixEmi].cle == cleEmis) + return ixEmi; + } + return -1; +} + +/** * Recherche d'une chane en partant de son numro * \param[in] nNumChaine Numro de la chane, tel que dfini dans la configuration des * chanes et tel qu'affich l'utilisateur @@ -408,6 +424,27 @@ } /** + * Dtermine le temps restant avant le prochain vnement EPG concernant n'importe quelle + * chane. + * \return Temps restant, exprim en millisecondes, ou bien #DUREE_INFINIE si aucun temps + * ne peut tre dtermin (aucune mission dfinie dans l'EPG ...). + **/ +long Chaines::timeBeforeNextEvent() +{ + long nTime = DUREE_INFINIE; + SYSTEMTIME localtime; + + GetLocalTime(&localtime); + for (ITERATE_CONST_VECTOR(*this, Chaine, it)) { + long nTmp = it->timeBeforeNextEvent(&localtime); + + if (nTmp < nTime) + nTime = nTmp; + } + return nTime; +} + +/** * Trouver le SID correspodant un index de chane. * \param[in] ixChaine Index dans la table #Canaux * \note Si on passe \p STREAM_PSEUDO_INDEX en paramtre, la fonction retourne \p STREAM_PSEUDO_SID. Modifié: trunk/channels.h =================================================================== --- trunk/channels.h 2009-12-18 17:50:17 UTC (rev 215) +++ trunk/channels.h 2009-12-19 00:57:59 UTC (rev 216) @@ -223,8 +223,8 @@ * Obtenir le temps restant avant le prochain changement d'tat EPG concernant cette chane. * * \param[in] pLocalTime Pointeur sur temps courant (rcupr en interne si NULL) - * \return Temps restant, exprim en millisecondes, ou bien #DUREE_INFINIE si aucun temps - * ne peut tre dtermin (aucune mission dfinie dans l'EPG ...). + * \return Temps restant, exprim en millisecondes, ou bien #DUREE_INFINIE si aucun temps + * ne peut tre dtermin (aucune mission dfinie dans l'EPG ...). **/ long timeBeforeNextEvent(LPSYSTEMTIME pLocalTime = NULL) const; @@ -242,6 +242,14 @@ /// Dterminer si l'enregistrement en mode PS est disponible bool isPsRecordAvailable() const { return video_type==vst_MPEG2;} // PS en MPEG2 seulement pour le moment + + /** + * Recherche, dans les informations d'une chane, de l'mission correspondant une cl d'mission donne + * + * \param[in] cleEmis Cl d'mission recherche + * \return Index de l'mission dans la liste, ou -1 si pas trouv + **/ + int cherche_emis_par_cle(UINT64 cleEmis) const; }; /// Type tableau des chanes @@ -303,6 +311,14 @@ * \retval -1 si le numro n'a pas t trouv **/ int trouve_par_Ids(const ChaineIDs & sIds) const; + + /** + * Dtermine le temps restant avant le prochain vnement EPG concernant n'importe quelle + * chane. + * \return Temps restant, exprim en millisecondes, ou bien #DUREE_INFINIE si aucun temps + * ne peut tre dtermin (aucune mission dfinie dans l'EPG ...). + **/ + long timeBeforeNextEvent(); }; Modifié: trunk/epg.cpp =================================================================== --- trunk/epg.cpp 2009-12-18 17:50:17 UTC (rev 215) +++ trunk/epg.cpp 2009-12-19 00:57:59 UTC (rev 216) @@ -30,6 +30,7 @@ #include "main.h" #include "ini.h" +#include "record.h" #include "recprog.h" #include "channels.h" @@ -42,107 +43,317 @@ #define EPG_COL_DESCRIPT 4 ///< Colonne indiquant la description du programme /** - * Ajoute l'emission indique la liste - * - * \param[in] hListItem handle de la liste devant contenir le nouveau programme - * \param[in] canal canal traiter, contenant le programme afficher - * \param[in] noEmis numro de l'emission afficher - * \param[in,out] iItem index dans la liste de l'lment ajouter + * Structure destine regrouper les informations affiches sur une ligne donne du dialogue EPG **/ -static void ajout_emission(HWND hListItem, const Chaine & canal, BYTE noEmis, int & iItem) +struct EpgRow { - if (noEmis >= canal.emi_count) - return; + int nNoChaine; //!< Numro de la chane (utilis pour le tri) + int ixChaine; //!< Index de la chane dans la table \p Canaux + INT32 khz; //!< Frquence utilise (pour test identit multiplex) + UINT32 cleChaine; //!< Cl chane (pour retrouver une chane dont la position aurait chang) + UINT64 cleEmis; //!< Cl mission (pour retrouver une mission dont la position aurait chang) + tstring strNomChaine; //!< Nom de la chane + SYSTEMTIME sDebut; //!< Heure de dbut de l'mission + SYSTEMTIME sFin; //!< Heure de fin de l'mission + tstring strNomProg; //!< Nom de l'mission + tstring strDesc; //!< Description de l'mission - const Emission & emis = canal.emis[noEmis]; + /** + * Constructeur + * \param[in] ixCh Index de la chane + * \param[in] ixEmi Index de l'mission dans la chane + **/ + EpgRow(int ixCh, int ixEmi); - if (!emis.isOk()) - return; + /// Obtenir une rfrence sur la chane (d'aprs \p ixChaine vrifi par \p cleChaine) + const Chaine & trouve_chaine(); - COPY_STR_ON_STACK(TCHAR, canal_nom, canal.nom, taille); + /** + * Ajout de l'mission dcrite dans la liste du dialogue + * \param[in] hListItem HANDLE du contrle d'affichage + * \param[in] nItm Index de cet enregistrement dans la table + * \param[in] bSel \p true si l'item est slectionner + * \note \p nItm ne correspondra au numro d'item de la liste au moment + * de son chargement, mais ce ne sera plus vrai une fois que cette + * liste aura t trie. + **/ + void EpgRow::ajout_emission(HWND hListItem, int nItm, bool bSel) const; +}; - LVITEM item = { - LVIF_TEXT | LVIF_PARAM, // mask - iItem, // iItem - EPG_COL_CHAINE, // iSubItem - 0, 0, // state, stateMask - canal_nom, // pszText - 0, // cchTextMax - 0, // iImage - LPARAM(canal.cle()) // lParam +/** + * Constructeur + * \param[in] ixCh Index de la chane + * \param[in] ixEmi Index de l'mission dans la chane + **/ +EpgRow::EpgRow(int ixCh, int ixEmi) +{ + const Chaine & canal = Canaux[ixCh]; + + nNoChaine = canal.nNumeroChaine; + ixChaine = (INT16)ixCh; + khz = canal.khz; + cleChaine = canal.cle(); + strcpy_T(strNomChaine, canal.nom); + + const Emission & sEmis = canal.emis[ixEmi]; + + cleEmis = sEmis.cle; + sDebut = sEmis.debut; + sFin = sEmis.fin; + strNomProg = sEmis.nom; + strDesc = sEmis.desc; +}; + +/// Obtenir une rfrence sur la chane (d'aprs \p ixChaine vrifi par \p cleChaine) +const Chaine & EpgRow::trouve_chaine() +{ + if (ixChaine_ok(ixChaine)) { + const Chaine * pCanal = &Canaux[ixChaine]; + + if (pCanal->cle() == cleChaine) + return *pCanal; + ixChaine = Canaux.trouve_par_cle(cleChaine); + if (ixChaine_ok(ixChaine)) + return Canaux[ixChaine]; + } + + // On ne devrait pas arriver ici, mais le cas chant, retourner la chane + // d'index 0 vitera de drfrencer un pointeur NULL. + return Canaux[0]; +} + +/** + * Ajout de l'mission dcrite dans la liste du dialogue + * \param[in] hListItem HANDLE du contrle d'affichage + * \param[in] nItm Index de cet enregistrement dans la table + * \param[in] bSel \p true si l'item est slectionner + * \note \p nItm ne correspondra au numro d'item de la liste au moment + * de son chargement, mais ce ne sera plus vrai une fois que cette + * liste aura t trie. + **/ +void EpgRow::ajout_emission(HWND hListItem, int nItm, bool bSel) const +{ + LVITEM item = { + LVIF_TEXT | LVIF_PARAM, // mask + nItm, // iItem + EPG_COL_CHAINE, // iSubItem + 0, 0, // state, stateMask + const_cast(strNomChaine.c_str()), // pszText + 0, // cchTextMax + 0, // iImage + LPARAM(nItm) // lParam }; - TCHAR str[16]; + TCHAR str[24]; SendMessage(hListItem, LVM_INSERTITEM, 0, (LPARAM)&item); item.pszText = const_cast(str); - TimeToStr(emis.debut, str, _countof(str)); + TimeToStr(sDebut, str, _countof(str)); item.iSubItem = EPG_COL_DEBUT; - SendMessage(hListItem, LVM_SETITEMTEXT, iItem, (LPARAM)&item); + SendMessage(hListItem, LVM_SETITEMTEXT, nItm, (LPARAM)&item); - TimeToStr(emis.fin, str, _countof(str)); + TimeToStr(sFin, str, _countof(str)); item.iSubItem = EPG_COL_FIN; - SendMessage(hListItem, LVM_SETITEMTEXT, iItem, (LPARAM)&item); + SendMessage(hListItem, LVM_SETITEMTEXT, nItm, (LPARAM)&item); - item.pszText = const_cast(emis.nom); + item.pszText = const_cast(strNomProg.c_str()); item.iSubItem = EPG_COL_PROGRAMME; - SendMessage(hListItem, LVM_SETITEMTEXT, iItem, (LPARAM)&item); + SendMessage(hListItem, LVM_SETITEMTEXT, nItm, (LPARAM)&item); - item.pszText = const_cast(emis.desc); + item.pszText = const_cast(strDesc.c_str()); item.iSubItem = EPG_COL_DESCRIPT; - SendMessage(hListItem, LVM_SETITEMTEXT, iItem, (LPARAM)&item); + SendMessage(hListItem, LVM_SETITEMTEXT, nItm, (LPARAM)&item); - iItem++; + if (bSel) { + item.stateMask = LVIS_SELECTED|LVIS_FOCUSED; + item.state = LVIS_SELECTED|LVIS_FOCUSED; + SendMessage(hListItem, LVM_SETITEMSTATE, nItm, (LPARAM)&item); + } } /** - * Comparaison de l'heure de dbut dans un item de la liste EPG avec une heure - * fournie au format \p SYSTEMTIME + * Classe contenant l'ensemble des donnes du dialogue EPG. + **/ +struct EpgRowList : public vector +{ + UINT32 cleChaine; //!< Cl de la chane slectionne + UINT64 cleEmis; //!< Cl de l'mission slectionne + HWND hList; //!< Handle du contrle de liste + int nColon; //!< Numro de colonne du dernier tri + bool bDescending; //!< \p true si le dernier tri tait descendant + + /// Constructeur + EpgRowList() : + cleChaine(0), + cleEmis(0), + hList(NULL), + nColon(0), + bDescending(false) + {} + + + /** + * Remplit la liste des programmes via l'EPG + **/ + void remplit_table_epg(); + + /** + * Obtenir les donnes de la ligne correspondant un item de la liste EPG + * + * \param[in] nItem Index de l'item recherch + **/ + EpgRow & GetRow(int nItem); + + /// Chercher l'item slectionn + int GetSelection() const; + + /** + * Fonction utilise pour trier la liste des missions + * + * \param[in] lParam1 index du permier lment + * \param[in] lParam2 index du second lment + * \param[in] lParamSort paramtres de tri + * \retval <0 lParam1 < lParam2 + * \retval 0 lParam1 = lParam2 + * \retval >0 lParam1 > lParam2 + **/ + static int CALLBACK LVEpgCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); + + void SortItems() { + ListView_SortItemsEx(hList, LVEpgCompareProc, this); } +}; + +/** + * Fonction utilise pour trier la liste des missions * - * \param[in] hListItem HANDLE de la liste d'items contenant les programmes - * \param[in] nItem Numro de l'item contenant l'heure recherche convertie en texte - * \param[in] sTim Heure recherche au format \p SYSTEMTIME - * \return \p true si les deux valeurs correspondent + * \param[in] lParam1 index du permier lment + * \param[in] lParam2 index du second lment + * \param[in] lParamSort paramtres de tri + * \retval <0 lParam1 < lParam2 + * \retval 0 lParam1 = lParam2 + * \retval >0 lParam1 > lParam2 **/ -static bool compare_item_hre(HWND hListItem, int nItem, SYSTEMTIME sTim) +int CALLBACK EpgRowList::LVEpgCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { - TCHAR szItemHre[16]; - TCHAR szCompHre[16]; + EpgRowList & cList = *reinterpret_cast(lParamSort); + EpgRow & sRow1 = cList.GetRow((int)lParam1); + EpgRow & sRow2 = cList.GetRow((int)lParam2); + int res = 0; // rsultat - ListView_GetItemText(hListItem, nItem, EPG_COL_DEBUT, szItemHre, _countof(szItemHre)); - TimeToStr(sTim, szCompHre, _countof(szCompHre)); - return _tcscmp(szItemHre, szCompHre)==0; + switch (cList.nColon) { + + case EPG_COL_CHAINE: + res = sRow1.nNoChaine - sRow2.nNoChaine; + if (res == 0) + res = DiffTime(sRow1.sDebut, sRow2.sDebut); + break; + + case EPG_COL_DEBUT: + res = DiffTime(sRow1.sDebut, sRow2.sDebut); + if (res == 0) + res = sRow1.nNoChaine - sRow2.nNoChaine; + break; + + case EPG_COL_FIN: + res = DiffTime(sRow1.sFin, sRow2.sFin); + if (res == 0) + res = sRow1.nNoChaine - sRow2.nNoChaine; + break; + + case EPG_COL_PROGRAMME: + res = _tcsicmp(sRow1.strNomProg.c_str(), sRow2.strNomProg.c_str()); + break; + + case EPG_COL_DESCRIPT: + res = _tcsicmp(sRow1.strDesc.c_str(), sRow2.strDesc.c_str()); + } + + // Tri descendant si pnml->lParam != 0 + if (cList.bDescending) + res = -res; + return res; } +/// Chercher l'item slectionn +int EpgRowList::GetSelection() const +{ + // S'assurer que l'item slectionn est visible + int nCount = ListView_GetItemCount(hList); + + for (int nInx = 0; nInx < nCount; ++nInx) { + if (ListView_GetItemState(hList, nInx, LVIS_SELECTED) != 0) + return nInx; + } + return -1; // Aucun item slectionn +} + /** - * Remplit la liste des programmes via l'EPG + * Obtenir les donnes de la ligne correspondant un item de la liste EPG * - * \param[in] hListItem handle de la liste devant contenir les programmes + * \param[in] nItem Index de l'item recherch **/ -static void remplit_table_epg(HWND hListItem) +EpgRow & EpgRowList::GetRow(int nItem) { - int iItem = 0; - int visible_index = -1; - int nbChaines = (int)Canaux.size(); + if (nItem >= 0) { + LVITEM item = { + LVIF_PARAM, // mask + nItem // iItem + // le reste zro (implicite) + }; - for (int i=0; i= 0) { - ListView_SetItemState(hListItem, visible_index, LVIS_SELECTED, LVIS_SELECTED); - ListView_SetSelectionMark(hListItem, visible_index); - ListView_EnsureVisible(hListItem, visible_index, FALSE); + // Remplissage du contrle de dialogue partir de la liste qu'on vient + // tout juste de gnrer + nInx = 0; + for (ITERATE_CONST_VECTOR(*this, EpgRow, ite)) { + const EpgRow & sRow = *ite; + + sRow.ajout_emission(hList, nInx++, + sRow.cleChaine == cleChaine && sRow.cleEmis == cleEmis); } + + // Si l'ordre de tri a t modifi, rapplication de celui-ci : + if (nColon != EPG_COL_CHAINE || bDescending) + SortItems(); + + // S'assurer que l'item slectionn est visible + nInx = GetSelection(); + if (nInx >= 0) + ListView_EnsureVisible(hList, nInx, FALSE); } /** @@ -191,6 +402,21 @@ } /** + * Dfinition d'un timer dont la dure est gale au temps avant l'heure la plus proche + * dans les dbuts ou fins d'missions de l'EPG. + **/ +static void SetEpgEventTimer(HWND hDlg) +{ + long nEvtDly = Canaux.timeBeforeNextEvent(); + + if (nEvtDly != DUREE_INFINIE) { + myprintf(TEXT("SetEpgEventTimer = %.2f\n"), nEvtDly/1000.0); + SetTimer(hDlg, TIMER_EPG_EVENT, nEvtDly, NULL); + } else + KillTimer(hDlg, TIMER_EPG_EVENT); +} + +/** * Fonction grant la bote de dialogue des programmes via l'EPG * \todo Amliorations envisager : * - Envisager sauvegarde de la dimension de cette bote de dialogue, @@ -209,20 +435,24 @@ {NULL, 0} // Terminateur }; - static HWND hListItem = NULL; //!< Handle de la liste + static EpgRowList sEpgRowLst; //!< Mmorisation du contenu de la liste et de la slection static RECT sSavRect; //!< Mmorisation du rectangle client dans WM_GETMINMAXINFO et avant WM_SIZE static DWORD dwLastEpgUpdate = 0; //!< Instant de la dernire mise jour de l'affichage EPG switch (uMsg) { case WM_INITDIALOG: - hListItem = GetDlgItem(hDlg, IDC_LIST_EPG); + // Initialisation des paramtres de tri par dfaut + sEpgRowLst.hList = GetDlgItem(hDlg, IDC_LIST_EPG); + sEpgRowLst.nColon = EPG_COL_CHAINE; + sEpgRowLst.bDescending = FALSE; // Initialise la liste (ajout de la grille, des colonnes, etc.) - ListView_AjouteColonnes(hListItem, t_cols); - remplit_table_epg(hListItem); + ListView_AjouteColonnes(sEpgRowLst.hList, t_cols); + sEpgRowLst.remplit_table_epg(); init_methodes(hDlg); ShowCursor(TRUE); // Suspend la disparition temporise du curseur + SetEpgEventTimer(hDlg); return TRUE; case WM_APPCOMMAND: @@ -271,6 +501,10 @@ case TIMER_EPG_UPDATE: PostMessage(hDlg, WM_APP_EPG_UPDATED, 0, 0); return TRUE; + + case TIMER_EPG_EVENT: + PostMessage(hDlg, WM_APP_EPG_EVENT, 0, 0); + return TRUE; } break; @@ -286,11 +520,21 @@ SetTimer(hDlg, TIMER_EPG_UPDATE, EPG_UPDATE_LIMIT-nDiff, NULL); return TRUE; } - ListView_DeleteAllItems(hListItem); dwLastEpgUpdate = dwTicks; - remplit_table_epg(hListItem); + + sEpgRowLst.remplit_table_epg(); + + SetEpgEventTimer(hDlg); return TRUE; } + + case WM_APP_EPG_EVENT: + // Au moins une couleur d'item a vraisemblablement chang : + // on rafrachit la liste. + InvalidateRect(sEpgRowLst.hList, NULL, FALSE); + SetEpgEventTimer(hDlg); + return TRUE; + case WM_COMMAND: switch(LOWORD(wParam)) { @@ -313,36 +557,24 @@ return TRUE; case IDC_RECORD: { - LVITEM item = { - LVIF_PARAM, // mask - ListView_GetSelectionMark(hListItem) // iItem - // le reste zro (implicite) - }; + int nItem = sEpgRowLst.GetSelection(); - if (ListView_GetItem(hListItem, &item)) { - int ixChaine = Canaux.trouve_par_cle(UINT32(item.lParam)); + if (nItem >= 0) { + EpgRow & sRow = sEpgRowLst.GetRow(nItem); - if (ixChaine_ok(ixChaine)) { - Chaine & canal = Canaux[ixChaine]; - Programme prog; - BYTE nNoEmis = 0; + const Chaine & canal = sRow.trouve_chaine(); + Programme prog; + int ixEmi = canal.cherche_emis_par_cle(sRow.cleEmis); - // Retrouver l'item qui a l'heure de dbut qui nous intresse - for (; nNoEmis<_countof(canal.emis); ++nNoEmis) { - if (compare_item_hre(hListItem, item.iItem, canal.emis[nNoEmis].debut)) - break; - } + if (ixEmi < 0 || !chaineToProg(sRow.ixChaine, (BYTE)ixEmi, prog) || !prog.verifie()) + return FALSE; - if (!chaineToProg(ixChaine, nNoEmis, prog) || !prog.verifie()) - return FALSE; + // Ces deux valeurs ont t extraites de la bote de dialogue au moment de leur slection : + prog.methode = epg_typerecvideo; + prog.audio = epg_typerecaudio; - // Ces deux valeurs ont t extraites de la bote de dialogue au moment de leur slection : - prog.methode = epg_typerecvideo; - prog.audio = epg_typerecaudio; - - Programmes.push_back(prog); - finalize_prog_change(); - } + Programmes.push_back(prog); + finalize_prog_change(); } else affiche_erreurs(TEXT("Pas de programme slectionn")); return TRUE; } @@ -354,28 +586,73 @@ // Notification envoye la liste switch (_ncode_(lParam)) { + case NM_CLICK: case NM_DBLCLK: { int nItem = reinterpret_cast(lParam)->iItem; - // Double clic sur un lment de la liste - myprintf(TEXT("EpgDialogProc, notification double clic %i") EOL, nItem); - if (nItem >= 0) { - LVITEM item = { - LVIF_PARAM, // mask - nItem // iItem - // le reste zro (implicite) - }; + EpgRow & sRow = sEpgRowLst.GetRow(nItem); - ListView_GetItem(hListItem, &item); + // Mmorisation de la nouvelle slection + sEpgRowLst.cleChaine = sRow.cleChaine; + sEpgRowLst.cleEmis = sRow.cleEmis; + if (_ncode_(lParam) == NM_DBLCLK) { + // Double clic : on change de chane + if (sRow.ixChaine != ixChaineCourante) + zappe_index(sRow.ixChaine); + } + } + break; } - int ixChaine = Canaux.trouve_par_cle(UINT32(item.lParam)); + case NM_CUSTOMDRAW: { + NMLVCUSTOMDRAW & sNlcd = *reinterpret_cast(lParam); - if (ixChaine != ixChaineCourante) - zappe_index(ixChaine); + switch(sNlcd.nmcd.dwDrawStage) { + + case CDDS_PREPAINT: + SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW); + return TRUE; + + case CDDS_ITEMPREPAINT: + // Ajustement des couleurs du texte et du fond + if (ixChaine_ok(ixChaineCourante)) { + EpgRow & sRow = sEpgRowLst.GetRow((int)sNlcd.nmcd.dwItemSpec); + SYSTEMTIME localtime; + + if (sRow.ixChaine == ixChaineCourante) + sNlcd.clrTextBk = RGB(208,255,208); // Chane courante : fond teint de vert + else if (sRow.khz == Canaux[ixChaineCourante].khz) + sNlcd.clrTextBk = RGB(255,255,224); // Mme multiplex : fond teint de jaune + + GetLocalTime(&localtime); + + if (DiffTime(sRow.sDebut, localtime) <= 0 && DiffTime(localtime, sRow.sFin) < 0) { + if (enregistrements_actuels.getRecordingDescrByKey(sRow.cleChaine) >= 0) + sNlcd.clrText = RGB(255,0,0); // mission enregistre en rouge + else + sNlcd.clrText = RGB(0,128,255); // mission en cours en bleu + } else + sNlcd.clrText = RGB(128,128,128); // mission en attente en gris + } + return TRUE; } break; } + case LVN_COLUMNCLICK: { // Clic sur la colonne => trie les missions + // Tri de la liste par clic sur un en-tte de colonne : + NMLISTVIEW & sNmLv = *reinterpret_cast(lParam); + int iCol = sNmLv.iSubItem; // N de colonne concerne + + if (sEpgRowLst.nColon != iCol) { + // Colonne diffrente : tri ascendant + sEpgRowLst.nColon = iCol; + sEpgRowLst.bDescending = false; + } else + // Mme colonne : inversion de l'ordre de tri + sEpgRowLst.bDescending = !sEpgRowLst.bDescending; + sEpgRowLst.SortItems(); // Tri + break; } + case LVN_KEYDOWN: // On a appuy sur une touche dans la liste if (reinterpret_cast(lParam)->wVKey == VK_F5) @@ -389,6 +666,7 @@ return TRUE; case WM_NCDESTROY: + sEpgRowLst.clear(); hEpgDlg = NULL; ShowCursor(FALSE); // Rtablit la disparition temporise du curseur } Modifié: trunk/main.cpp =================================================================== --- trunk/main.cpp 2009-12-18 17:50:17 UTC (rev 215) +++ trunk/main.cpp 2009-12-19 00:57:59 UTC (rev 216) @@ -503,6 +503,10 @@ // Arrt d'enregistrement retard : cet item est actif si au moins un enregistrement // est en cours, quel qu'il soit : set_menu_enable_state(hRecMenu, IDM_DELAYED_STOP, active); + + // Rafrachissement de la liste EPG si ouverte (pour changement de couleurs) + if (hEpgDlg) + PostMessage(hEpgDlg, WM_APP_EPG_EVENT, 0, 0); } static void update_pistes_menu(HMENU hMenu) @@ -815,9 +819,9 @@ GetCursorPos(&pos); - // Copie des menus 0=Fichier, 1=Filtres, 2=Commandes, - // 3=Chaines, 4=Pistes, 5=Captures, 6=Programme. - for (int i=0; i<=6; i++) { + // Copie des menus 0=Fichier, 1=Chanes, 2=Vido, + // 3=Audio, 4=Information, 5=Enregistrer, 6=Options. + for (int i=MENU_FICHIER_POSITION; i<=MENU_OPTIONS_POSITION; i++) { TCHAR nom_menu[64]; HMENU contenu_copie = copie_menu(GetSubMenu(hMainMenu, i)); Modifié: trunk/main.h =================================================================== --- trunk/main.h 2009-12-18 17:50:17 UTC (rev 215) +++ trunk/main.h 2009-12-19 00:57:59 UTC (rev 216) @@ -91,6 +91,7 @@ #define TIMER_NOTIFY_UPDATE 134 //!< Auto-mise jour du tooltip de l'icne de notification et du message MSN #define TIMER_ZAPPING2 135 //!< Comme #TIMER_ZAPPING, mais 2me essai #define TIMER_ZOOM 136 //!< Temps avant application d'un changement de zoom +#define TIMER_EPG_EVENT 137 //!< Temps avant prochaine expiration horaire dans l'EPG /** @} */ // fin de TIMER_codes @@ -106,7 +107,8 @@ #define WM_APP_TRAYICON_MSG (WM_APP+0) /** - * Notification de changement dans le guide de programmation (EPG) + * Notification de changement dans le guide de programmation (EPG), ncessitant + * que la liste soit reconstruite. **/ #define WM_APP_EPG_UPDATED (WM_APP+1) @@ -120,8 +122,11 @@ **/ #define WM_APP_PROG_CHANGED (WM_APP+3) -/// Obsolete -#define WM_APP_SCAN_NEXT (WM_APP+4) +/** + * Notification d'une vnement dans le guide de programmation (EPG), + * ncessitant seulement une mise jour des couleur + **/ +#define WM_APP_EPG_EVENT (WM_APP+4) /** * Traitement des messages d'information envoys au cours de la recherche From pouchintv-dev at baysse.fr Sun Dec 20 10:59:26 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Sun, 20 Dec 2009 09:59:26 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r217 - tags Message-ID: <20091220095919.CBD915F770@mail.baysse.fr> Author: gingko Date: 2009-12-20 10:59:19 +0100 (dim 20 dc 2009) New Revision: 217 Added: tags/pouchintv_mod-0.6.0/ Log: Cration d'une tiquette (?tag?) pour la version 0.6.0 ( partir de la version 0.6.0.216 RC). Les quelques changements venir vers la version finale seront livrs sparment dans cette tiquette et dans le tronc principal. From pouchintv-dev at baysse.fr Mon Dec 21 00:23:46 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Sun, 20 Dec 2009 23:23:46 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r218 - tags/pouchintv_mod-0.6.0 Message-ID: <20091220232338.B46595F73A@mail.baysse.fr> Author: gingko Date: 2009-12-21 00:23:38 +0100 (lun 21 déc 2009) New Revision: 218 Modified: tags/pouchintv_mod-0.6.0/epg.cpp tags/pouchintv_mod-0.6.0/search.cpp tags/pouchintv_mod-0.6.0/update.cpp Log: Correctifs mineurs concernant la version 0.6.0. epg.cpp : * Les couleurs de fond dans l'EPG sont rendues légèrement plus sombres. search.cpp : * Ajout de messages de debugging dans la recherche de tuners. update.cpp : * La recherche de mise à jour ne testait le numéro de version que sur les trois premiers chiffres. Modifié: tags/pouchintv_mod-0.6.0/epg.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/epg.cpp 2009-12-20 09:59:19 UTC (rev 217) +++ tags/pouchintv_mod-0.6.0/epg.cpp 2009-12-20 23:23:38 UTC (rev 218) @@ -620,9 +620,9 @@ SYSTEMTIME localtime; if (sRow.ixChaine == ixChaineCourante) - sNlcd.clrTextBk = RGB(208,255,208); // Chane courante : fond teint de vert + sNlcd.clrTextBk = RGB(192,255,192); // Chane courante : fond teint de vert else if (sRow.khz == Canaux[ixChaineCourante].khz) - sNlcd.clrTextBk = RGB(255,255,224); // Mme multiplex : fond teint de jaune + sNlcd.clrTextBk = RGB(255,255,208); // Mme multiplex : fond teint de jaune GetLocalTime(&localtime); Modifié: tags/pouchintv_mod-0.6.0/search.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/search.cpp 2009-12-20 09:59:19 UTC (rev 217) +++ tags/pouchintv_mod-0.6.0/search.cpp 2009-12-20 23:23:38 UTC (rev 218) @@ -282,11 +282,14 @@ tstring strPath; hr = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" - if (FAILED(hr)) + if (FAILED(hr)) { + myprintf(ERRX(TEXT("Erreur : impossible d'obtenir le device path pour %s, hr=0x%x")), cMnkb.strName.c_str(), hr); return S_OK; // Invalide : S_OK pour continuer chercher + } // Tenter d'ajouter le filtre au graphe hr = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); + myprintf(TEXT("%*sEssai %s, hr=0x%x\n"), bFirst ? 4 : 6, TEXT(""), cMnkb.strName.c_str(), hr); if (FAILED(hr)) return S_OK; // Invalide : S_OK pour continuer chercher @@ -307,7 +310,7 @@ // Retirer le filtre hr = pTestGraph->PopFilter(); - myprintf(CMyP ERRX(TEXT("chec dpilage du filtre rcepteur pendant la recherche, hr=0x%08x")), FAILED(hr), hr); + myprintf(TEXT("%*sRetrait %s, hr=0x%x\n"), bFirst ? 4 : 6, TEXT(""), cMnkb.strName.c_str(), hr); // Retour avec S_FALSE pour indiquer qu'on arrte de chercher return S_FALSE; @@ -332,8 +335,12 @@ vResults(vRslts), pTestGraph(new_TunerGraph(bLegacy)) { - if (pTestGraph.get()) + myprintf(TEXT("Dbut recherche tuners, creation du graphe\n")); + if (pTestGraph.get()) { hr = pTestGraph->Build(); + + myprintf(CMyP TEXT("Echec construction du graphe, code 0x%08x\n"), FAILED(hr), hr); + } } @@ -357,19 +364,24 @@ // cette fonctionnalit n'est pas exploitable ce stade) if (!pTestGraph->isLegacyGraph()) { hr = pTestGraph->change_frequence(-1, -1); - if (FAILED(hr)) + if (FAILED(hr)) { + myprintf(ERRX(TEXT("Erreur : slection frquence impossible, hr=0x%x")), hr); return hr; + } } #endif tstring strPath; hr = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" - if (FAILED(hr)) + if (FAILED(hr)) { + myprintf(ERRX(TEXT("Erreur : impossible d'obtenir le device path pour %s, hr=0x%x")), cMnkb.strName.c_str(), hr); return S_OK; // Invalide : S_OK pour continuer chercher + } // Tenter d'ajouter le filtre au graphe hr = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); + myprintf(TEXT(" Essai %s, hr=0x%x\n"), cMnkb.strName.c_str(), hr); if (FAILED(hr)) return S_OK; // chec : on retourne nanmoins avec S_OK (pour continuer chercher) @@ -377,14 +389,13 @@ DeviceInfo sInf; sInf.asDev[dt_Tuner].Set(cMnkb.strName.c_str(), strPath.c_str()); - // Chercher les filtres matriels supplmentaires qui pourraient tre requis hr = CSearchReceiver(pTestGraph.get(), dt_Demod, sInf).Do(); // Retirer le filtre tuner HRESULT hr2 = pTestGraph->PopFilter(); - myprintf(CMyP ERRX(TEXT("chec dpilage du filtre tuner pendant la recherche, hr=0x%08x")), FAILED(hr2), hr2); + myprintf(TEXT(" Retrait %s, hr=0x%x\n"), cMnkb.strName.c_str(), hr2); // Ajouter le rsultat l'ensembles des rsultats de la liste if (SUCCEEDED(hr)) Modifié: tags/pouchintv_mod-0.6.0/update.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/update.cpp 2009-12-20 09:59:19 UTC (rev 217) +++ tags/pouchintv_mod-0.6.0/update.cpp 2009-12-20 23:23:38 UTC (rev 218) @@ -136,7 +136,9 @@ nMajor==sV2.nMajor && ( nMinor>sV2.nMinor || nMinor==sV2.nMinor && - nRev>sV2.nRev); + nRev > sV2.nRev || + nRev == sV2.nRev && + atoi(szSvn) > atoi(sV2.szSvn)); } bool operator < (const AppVersion & sV2) const { From pouchintv-dev at baysse.fr Wed Dec 23 14:38:15 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Wed, 23 Dec 2009 13:38:15 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r219 - tags/pouchintv_mod-0.6.0 Message-ID: <20091223133803.5C38D5F760@mail.baysse.fr> Author: gingko Date: 2009-12-23 14:38:02 +0100 (mer 23 déc 2009) New Revision: 219 Modified: tags/pouchintv_mod-0.6.0/Pouchin TV_2005.sln tags/pouchintv_mod-0.6.0/Pouchin TV_2005.vcproj tags/pouchintv_mod-0.6.0/Pouchin TV_2008.sln tags/pouchintv_mod-0.6.0/Pouchin TV_2008.vcproj tags/pouchintv_mod-0.6.0/Programme_Install.nsi tags/pouchintv_mod-0.6.0/Setup_2005.vcproj tags/pouchintv_mod-0.6.0/Setup_2008.vcproj tags/pouchintv_mod-0.6.0/config.h tags/pouchintv_mod-0.6.0/console.cpp tags/pouchintv_mod-0.6.0/filters.cpp tags/pouchintv_mod-0.6.0/graph.cpp tags/pouchintv_mod-0.6.0/graph.h tags/pouchintv_mod-0.6.0/ini.cpp tags/pouchintv_mod-0.6.0/main.cpp tags/pouchintv_mod-0.6.0/search.cpp tags/pouchintv_mod-0.6.0/update.cpp Log: Diagnostic et correctif mineur concernant la version 0.6.0. Pouchin TV_2005.sln, Pouchin TV_2005.vcproj, Pouchin TV_2008.sln, Pouchin TV_2008.vcproj, Setup_2005.vcproj, Setup_2008.vcproj, Programme_Install.nsi : * Ajout d'une configuration nommée "Diagnostic", qui affiche la console de debugging (et active quelques autres éléments de diagnostic) de la même façon que les configurations "Debug", tout en restant en mode "Release" pour le reste de la compilation ainsi que pour les bibliothèques run-time qui sont liées. Ceci permet d'éviter les soucis fréquemment rencontrés d'applications qui refusent de s'exécuter lorsque les bibliothèques de debugging ne sont pas installées. * Suppression de certaines bibliothèques liées en entrée de l'éditeur de liens, qui font double emploi du fait des inclusions implicites aux dépendances déclarées. Ces liaisons étaient de plus gênantes lorsqu'on mélange des configurations de projet de noms différents. config.h, ini.cpp, main.cpp, update.cpp, graph.h, graph.cpp : * Modification de certains tests de compilation conditionnelle afin que ceux-ci s'activent en compilation de "Diagnostic" aussi bien qu'en compilation "Debug". filters.cpp, graph.cpp, search.cpp : * Ajout de messages de debugging affichables dans la console, en mode debug/diagnostic. console.cpp : * Ajout d'un "handler" permettant de fermer proprement l'application si on clique sur la case de fermeture de la console, évitant ainsi d'avoir le message indiquant que l'application n'a pas été quittée correctement si on a fermé Pouchin TV Mod à l'aide cette case de fermeture. ini.cpp : * Correction d'un bug : duplicatas dans les noms de quatre codes de raccourcis. Modifié: tags/pouchintv_mod-0.6.0/Pouchin TV_2005.sln =================================================================== --- tags/pouchintv_mod-0.6.0/Pouchin TV_2005.sln 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/Pouchin TV_2005.sln 2009-12-23 13:38:02 UTC (rev 219) @@ -21,6 +21,8 @@ Debug_SBCS|x64 = Debug_SBCS|x64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Diagnostic|Win32 = Diagnostic|Win32 + Diagnostic|x64 = Diagnostic|x64 Release_SBCS|Win32 = Release_SBCS|Win32 Release_SBCS|x64 = Release_SBCS|x64 Release|Win32 = Release|Win32 @@ -35,6 +37,10 @@ {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|Win32.Build.0 = Debug|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|x64.ActiveCfg = Debug|x64 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|x64.Build.0 = Debug|x64 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|Win32.ActiveCfg = Diagnostic|Win32 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|Win32.Build.0 = Diagnostic|Win32 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|x64.ActiveCfg = Diagnostic|x64 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|x64.Build.0 = Diagnostic|x64 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|Win32.ActiveCfg = Release_SBCS|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|Win32.Build.0 = Release_SBCS|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|x64.ActiveCfg = Release_SBCS|x64 @@ -51,6 +57,10 @@ {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|Win32.Build.0 = Debug|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|x64.ActiveCfg = Debug|x64 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|x64.Build.0 = Debug|x64 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|Win32.ActiveCfg = Release|Win32 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|Win32.Build.0 = Release|Win32 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|x64.ActiveCfg = Release|x64 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|x64.Build.0 = Release|x64 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|Win32.ActiveCfg = Release_MBCS|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|Win32.Build.0 = Release_MBCS|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|x64.ActiveCfg = Release_MBCS|x64 @@ -67,6 +77,10 @@ {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|Win32.Build.0 = Debug|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|x64.ActiveCfg = Debug|x64 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|x64.Build.0 = Debug|x64 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|Win32.ActiveCfg = Release|Win32 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|Win32.Build.0 = Release|Win32 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|x64.ActiveCfg = Release|x64 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|x64.Build.0 = Release|x64 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|Win32.ActiveCfg = Release|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|Win32.Build.0 = Release|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|x64.ActiveCfg = Release|x64 @@ -79,6 +93,8 @@ {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug_SBCS|x64.ActiveCfg = Debug_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug|Win32.ActiveCfg = Debug|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug|x64.ActiveCfg = Debug|Win32 + {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Diagnostic|Win32.ActiveCfg = Diagnostic|Win32 + {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Diagnostic|x64.ActiveCfg = Diagnostic|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release_SBCS|Win32.ActiveCfg = Release_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release_SBCS|x64.ActiveCfg = Release_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release|Win32.ActiveCfg = Release|Win32 Modifié: tags/pouchintv_mod-0.6.0/Pouchin TV_2005.vcproj =================================================================== --- tags/pouchintv_mod-0.6.0/Pouchin TV_2005.vcproj 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/Pouchin TV_2005.vcproj 2009-12-23 13:38:02 UTC (rev 219) @@ -68,7 +68,7 @@ /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1054,6 +1245,10 @@ > + + Modifié: tags/pouchintv_mod-0.6.0/Pouchin TV_2008.sln =================================================================== --- tags/pouchintv_mod-0.6.0/Pouchin TV_2008.sln 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/Pouchin TV_2008.sln 2009-12-23 13:38:02 UTC (rev 219) @@ -21,6 +21,8 @@ Debug_SBCS|x64 = Debug_SBCS|x64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Diagnostic|Win32 = Diagnostic|Win32 + Diagnostic|x64 = Diagnostic|x64 Release_SBCS|Win32 = Release_SBCS|Win32 Release_SBCS|x64 = Release_SBCS|x64 Release|Win32 = Release|Win32 @@ -35,6 +37,10 @@ {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|Win32.Build.0 = Debug|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|x64.ActiveCfg = Debug|x64 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|x64.Build.0 = Debug|x64 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|Win32.ActiveCfg = Diagnostic|Win32 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|Win32.Build.0 = Diagnostic|Win32 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|x64.ActiveCfg = Diagnostic|x64 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|x64.Build.0 = Diagnostic|x64 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|Win32.ActiveCfg = Release_SBCS|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|Win32.Build.0 = Release_SBCS|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|x64.ActiveCfg = Release_SBCS|x64 @@ -51,6 +57,10 @@ {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|Win32.Build.0 = Debug|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|x64.ActiveCfg = Debug|x64 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|x64.Build.0 = Debug|x64 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|Win32.ActiveCfg = Release|Win32 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|Win32.Build.0 = Release|Win32 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|x64.ActiveCfg = Release|x64 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|x64.Build.0 = Release|x64 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|Win32.ActiveCfg = Release_MBCS|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|Win32.Build.0 = Release_MBCS|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|x64.ActiveCfg = Release_MBCS|x64 @@ -67,6 +77,10 @@ {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|Win32.Build.0 = Debug|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|x64.ActiveCfg = Debug|x64 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|x64.Build.0 = Debug|x64 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|Win32.ActiveCfg = Release|Win32 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|Win32.Build.0 = Release|Win32 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|x64.ActiveCfg = Release|x64 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|x64.Build.0 = Release|x64 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|Win32.ActiveCfg = Release|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|Win32.Build.0 = Release|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|x64.ActiveCfg = Release|x64 @@ -79,6 +93,8 @@ {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug_SBCS|x64.ActiveCfg = Debug_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug|Win32.ActiveCfg = Debug|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug|x64.ActiveCfg = Debug|Win32 + {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Diagnostic|Win32.ActiveCfg = Diagnostic|Win32 + {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Diagnostic|x64.ActiveCfg = Diagnostic|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release_SBCS|Win32.ActiveCfg = Release_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release_SBCS|x64.ActiveCfg = Release_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release|Win32.ActiveCfg = Release|Win32 Modifié: tags/pouchintv_mod-0.6.0/Pouchin TV_2008.vcproj =================================================================== --- tags/pouchintv_mod-0.6.0/Pouchin TV_2008.vcproj 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/Pouchin TV_2008.vcproj 2009-12-23 13:38:02 UTC (rev 219) @@ -69,7 +69,7 @@ /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1047,6 +1236,10 @@ > + + Modifié: tags/pouchintv_mod-0.6.0/Programme_Install.nsi =================================================================== --- tags/pouchintv_mod-0.6.0/Programme_Install.nsi 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/Programme_Install.nsi 2009-12-23 13:38:02 UTC (rev 219) @@ -53,7 +53,7 @@ ;$DEBUG_SFX est un suffixe ajout au nom de l'application et de l'installeur pour ;diffrencier les versions Debug ;Cette variable est dfinir est dfinir par /DDEBUG_SFX=xxxx en ligne de commande - ;Normalement vide (par dfaut) ou bien "_debug" + ;Normalement vide (par dfaut) ou bien "_debug" ou "_diag" !ifndef DEBUG_SFX !define DEBUG_SFX "" !endif @@ -61,7 +61,7 @@ ;$DSPDBG_SFX est un suffixe ajout au nom des rpertoires et des raccourcis du menu dmarrer ;pour diffrencier les versions Debug ;Cette variable est dfinir est dfinir par /DDSPDBG_SFX=xxxx en ligne de commande - ;Normalement vide (par dfaut) ou bien " (debug)" + ;Normalement vide (par dfaut) ou bien " (debug)" ou " (diag)" !ifndef DSPDBG_SFX !define DSPDBG_SFX "" !endif Modifié: tags/pouchintv_mod-0.6.0/Setup_2005.vcproj =================================================================== --- tags/pouchintv_mod-0.6.0/Setup_2005.vcproj 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/Setup_2005.vcproj 2009-12-23 13:38:02 UTC (rev 219) @@ -22,6 +22,18 @@ CharacterSet="0" WholeProgramOptimization="0" > + + + + + + + + + + + + + + + + + + + + + + @@ -67,7 +136,7 @@ @@ -78,7 +147,7 @@ @@ -89,7 +158,7 @@ @@ -100,11 +169,22 @@ + + + Modifié: tags/pouchintv_mod-0.6.0/Setup_2008.vcproj =================================================================== --- tags/pouchintv_mod-0.6.0/Setup_2008.vcproj 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/Setup_2008.vcproj 2009-12-23 13:38:02 UTC (rev 219) @@ -24,6 +24,18 @@ WholeProgramOptimization="0" EnableManagedIncrementalBuild="0" > + + + + + + + + + + + + + + + + + + + + + + @@ -72,7 +142,7 @@ @@ -83,7 +153,7 @@ @@ -94,7 +164,7 @@ @@ -105,11 +175,22 @@ + + + Modifié: tags/pouchintv_mod-0.6.0/config.h =================================================================== --- tags/pouchintv_mod-0.6.0/config.h 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/config.h 2009-12-23 13:38:02 UTC (rev 219) @@ -118,7 +118,7 @@ /** * Activation / dsactivation de la journalisation dans DirectShow **/ -#ifdef _DEBUG +#ifdef _DIAGNOSTIC #define LOG_DSHOW 1 #else #define LOG_DSHOW 0 Modifié: tags/pouchintv_mod-0.6.0/console.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/console.cpp 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/console.cpp 2009-12-23 13:38:02 UTC (rev 219) @@ -34,6 +34,7 @@ ********************************************************************************************/ #include "console.h" +#include "main.h" #include #include #include @@ -55,8 +56,23 @@ hConsMutex(NULL), f(NULL), nFileRes(0) - {} + { + } + /** + * Interception d'un clic sur la case de fermeture de la console, et transformation en + * fermeture de la fentre principale (ceci permet de s'assurer que les mises jour faites + * la fermeture de l'application sont effectues proprement). + **/ + static BOOL WINAPI HandlerRoutine(DWORD dwCtrlType) + { + if (dwCtrlType == CTRL_CLOSE_EVENT) { + PostMessage(hMainWnd, WM_CLOSE, 0, NULL); + return TRUE; + } + return FALSE; + } + /// Sortie brute d'un message vers la console void RawOutput(LPCTSTR pszMsg); @@ -265,10 +281,11 @@ { if (alloc) { AllocConsole(); - SetConsoleTitle(TEXT("Debug Window")); + SetConsoleTitle(TEXT("Fentre de diagnostic de Pouchin TV Mod")); } hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); hConsMutex = CreateMutex(NULL, FALSE, NULL); + SetConsoleCtrlHandler(HandlerRoutine, TRUE); } void startConsoleWin(bool alloc) Modifié: tags/pouchintv_mod-0.6.0/filters.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/filters.cpp 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/filters.cpp 2009-12-23 13:38:02 UTC (rev 219) @@ -218,6 +218,7 @@ { HRESULT hr = CreateBindCtx(0, &pBindCtx); + myprintf(CMyP ERRX(TEXT("chec CreateBindCtx, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) hr = BindProperties(); @@ -322,7 +323,6 @@ LPWSTR pszDisplayName; HRESULT hr = pMoniker->GetDisplayName(pBindCtx, NULL, &pszDisplayName); - if (SUCCEEDED(hr)) { strcpy_T(strDevicePath, pszDisplayName); @@ -387,7 +387,7 @@ HRESULT hr = pFilter->EnumPins(&pEnumPins); if (FAILED(hr)) { - myprintf(ERRX(TEXT("Erreur cherche_pin/EnumPins hr=0x%08x")), hr); + myprintf(ERRX(TEXT("Erreur cherche_pin/EnumPins(%i) hr=0x%08x")), dir, hr); return hr; } @@ -395,7 +395,7 @@ PIN_DIRECTION direction; if (FAILED(hr = pPin->QueryDirection(&direction))) { - myprintf(ERRX(TEXT("Erreur cherche_pin/QueryDirection, hr=0x%08x")), hr); + myprintf(ERRX(TEXT("Erreur cherche_pin/QueryDirection(%i), hr=0x%08x")), dir, hr); break; } @@ -411,7 +411,7 @@ break; } } else if (FAILED(hr)) { - myprintf(ERRX(TEXT("Erreur cherche_pin/ConnectedTo, hr=0x%08x")), hr); + myprintf(ERRX(TEXT("Erreur cherche_pin/ConnectedTo(%i), hr=0x%08x")), dir, hr); break; } } else { Modifié: tags/pouchintv_mod-0.6.0/graph.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/graph.cpp 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/graph.cpp 2009-12-23 13:38:02 UTC (rev 219) @@ -370,6 +370,7 @@ if (pDVBTuningSpace) { //Get new TuneRequest from tuning space hr = pDVBTuningSpace->CreateTuneRequest(&pTuneRequest); + myprintf(CMyP ERRX(TEXT("chec CreateTuneRequest, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) { //Get interface to the TuneRequest CComQIPtr pDVBTuneRequest(pTuneRequest); @@ -378,20 +379,30 @@ CComPtr pDVBTLocator; hr = pDVBTLocator.CoCreateInstance(CLSID_DVBTLocator); + myprintf(CMyP ERRX(TEXT("chec pDVBTLocator.CoCreateInstance, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) { hr = pDVBTLocator->put_CarrierFrequency(frequency); + myprintf(CMyP ERRX(TEXT("chec put_CarrierFrequency, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) { hr = pDVBTLocator->put_Bandwidth(bandwidth); + myprintf(CMyP ERRX(TEXT("chec put_Bandwidth, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) { // Bind the locator to the tune request. hr = pDVBTuneRequest->put_Locator(pDVBTLocator); + myprintf(CMyP ERRX(TEXT("chec put_Locator, code 0x%08x")), FAILED(hr), hr); - if (SUCCEEDED(hr)) + if (SUCCEEDED(hr)) { hr = pDVBTuneRequest->put_ONID(ONID); - if (SUCCEEDED(hr)) + myprintf(CMyP ERRX(TEXT("chec put_ONID, code 0x%08x")), FAILED(hr), hr); + } + if (SUCCEEDED(hr)) { hr = pDVBTuneRequest->put_TSID(TSID); - if (SUCCEEDED(hr)) + myprintf(CMyP ERRX(TEXT("chec put_TSID, code 0x%08x")), FAILED(hr), hr); + } + if (SUCCEEDED(hr)) { hr = pDVBTuneRequest->put_SID(SID); + myprintf(CMyP ERRX(TEXT("chec put_SID, code 0x%08x")), FAILED(hr), hr); + } } } } @@ -546,7 +557,7 @@ /// Construction du graphe virtual HRESULT Build(); - #ifdef _DEBUG + #ifdef _DIAGNOSTIC virtual tstring get_graph_state(); #endif @@ -658,8 +669,10 @@ CComPtr pInPin; HRESULT hr = cherche_pin(pFilter, PINDIR_INPUT, pInPin, NOTCONNECTED); + myprintf(CMyP ERRX(TEXT("chec connect_pin_to_filter/cherche_pin(IN), code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) { hr = pFGrph->ConnectDirect(pOutPin, pInPin, NULL); + myprintf(CMyP ERRX(TEXT("chec connect_pin_to_filter/ConnectDirect, code 0x%08x")), FAILED(hr), hr); } return hr; } @@ -676,6 +689,7 @@ CComPtr pOutPin; HRESULT hr = cherche_pin(source, PINDIR_OUTPUT, pOutPin); + myprintf(CMyP ERRX(TEXT("chec connect_filters/cherche_pin(OUT), code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) hr = connect_pin_to_filter(pOutPin, dest); return hr; @@ -701,7 +715,7 @@ return pFGrph->Disconnect(pInPin); } -#ifdef _DEBUG +#ifdef _DIAGNOSTIC tstring CPTvM_GraphBase::get_graph_state() { OAFilterState state = graph_GetState(); @@ -798,7 +812,7 @@ **/ static HRESULT Search_IBDA_Topology(const CComPtr & pTuner, REFIID iid, CComPtr & pUnk); -#ifdef _DEBUG +#ifdef _DIAGNOSTIC static HRESULT View_IBDA_Topology(const CComPtr & pTuner); #endif @@ -1248,7 +1262,10 @@ if (!pTuner) return E_NOINTERFACE; - return pTuner->put_TuneRequest(pTuneRequest); + HRESULT hr = pTuner->put_TuneRequest(pTuneRequest); + + myprintf(CMyP ERRX(TEXT("chec put_TuneRequest, code 0x%08x")), FAILED(hr), hr); + return hr; } /** @@ -1378,7 +1395,7 @@ return hr; } -#ifdef _DEBUG +#ifdef _DIAGNOSTIC HRESULT CPTvM_TunerGraph::View_IBDA_Topology(const CComPtr & pTuner) { @@ -1894,15 +1911,21 @@ { HRESULT hr = AddFilterToGraph(pFilter, pszName); - if (FAILED(hr)) + if (FAILED(hr)) { + myprintf(ERRX(TEXT("chec PushFilter/AddFilterToGraph, code 0x%08x")), hr); return hr; + } hr = connect_filters(pTailFilter, pFilter); + myprintf(CMyP ERRX(TEXT("chec PushFilter/connect_filters, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) pTailFilter = pFilter; - else - pFGrph->RemoveFilter(pFilter); + else { + HRESULT hr2 = pFGrph->RemoveFilter(pFilter); + myprintf(CMyP ERRX(TEXT("chec PushFilter/RemoveFilter, code 0x%08x")), FAILED(hr2), hr2); + } + return hr; } @@ -1920,6 +1943,7 @@ CComPtr pInPin; hr = cherche_pin(pTailFilter, PINDIR_INPUT, pInPin); + myprintf(CMyP ERRX(TEXT("chec PopFilter/cherche_pin(IN), code 0x%08x")), FAILED(hr), hr); if (FAILED(hr)) return hr; @@ -1927,11 +1951,14 @@ // Trouver la broche de sortie du filtre auquel il est connect hr = pInPin->ConnectedTo(&pOutPin); - if (FAILED(hr)) + if (FAILED(hr)) { + myprintf(ERRX(TEXT("chec PopFilter/ConnectedTo, code 0x%08x")), hr); return hr; + } // Trouver quel fitre appartient cette broche de sortie hr = pOutPin->QueryPinInfo(&pin_info); + myprintf(CMyP ERRX(TEXT("chec PopFilter/QueryPinInfo, code 0x%08x")), FAILED(hr), hr); if (pin_info.pFilter) pin_info.pFilter->Release(); // liminer la rfrence en suspens (le pointeur reste valide) // Ignorer le code retour : si pas de filtre, pTailFilter sera NULL @@ -1940,8 +1967,10 @@ // Retirer le filtre hr = pFGrph->RemoveFilter(pTailFilter); - if (FAILED(hr)) + if (FAILED(hr)) { + myprintf(ERRX(TEXT("chec PopFilter/RemoveFilter, code 0x%08x")), hr); return hr; + } // Le filtre prcdent devient le dernier de la file pTailFilter = pin_info.pFilter; @@ -2020,7 +2049,7 @@ { HRESULT hr; - #ifdef _DEBUG + #ifdef _DIAGNOSTIC View_IBDA_Topology(pNetworkTuner); #endif Modifié: tags/pouchintv_mod-0.6.0/graph.h =================================================================== --- tags/pouchintv_mod-0.6.0/graph.h 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/graph.h 2009-12-23 13:38:02 UTC (rev 219) @@ -137,7 +137,7 @@ **/ virtual bool graph_isRunning() const = 0; -#ifdef _DEBUG +#ifdef _DIAGNOSTIC virtual tstring get_graph_state() = 0; #endif EndInterface Modifié: tags/pouchintv_mod-0.6.0/ini.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/ini.cpp 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/ini.cpp 2009-12-23 13:38:02 UTC (rev 219) @@ -60,8 +60,8 @@ {IDM_CHAN_AUG, TEXT("Chane suivante"), TEXT("Chane suiv"), {false, false, false, VK_DOWN}}, {IDM_CHAN_DIM, TEXT("Chane prcdente"), TEXT("Chane prc"), {false, false, false, VK_UP}}, {IDM_LAST_CHAN, TEXT("Retour dernire chane vue"), TEXT("Chane retour"), {false, false, false, VK_BACK}}, - {IDM_CHAN_AUG_MPX, TEXT("Chane suivante du multiplex"), TEXT("Chane suiv"), {true, false, false, VK_DOWN}}, - {IDM_CHAN_DIM_MPX, TEXT("Chane prcdente du multiplex"), TEXT("Chane prc"), {true, false, false, VK_UP}}, + {IDM_CHAN_AUG_MPX, TEXT("Chane suivante du multiplex"), TEXT("Chane suiv mx"), {true, false, false, VK_DOWN}}, + {IDM_CHAN_DIM_MPX, TEXT("Chane prcdente du multiplex"), TEXT("Chane prc mx"), {true, false, false, VK_UP}}, {IDM_CHAN_TUNE, TEXT("Forcer une resyntonisation"), TEXT("Chane Resyntoniser"),{false, true, false, TEXT('F')}}, // EPG {IDM_EPG, TEXT("Guide des programmes"), TEXT("EPG Guide progs"), {false, false, false, TEXT('G')}}, @@ -92,7 +92,7 @@ {IDM_ALLWDT, TEXT("Utiliser toute la largeur"), TEXT("Aff Pleine largeur"), {false, false, false, TEXT('W')}}, {IDM_ALLHGT, TEXT("Utiliser toute la hauteur"), TEXT("Aff Pleine hauteur"), {false, false, false, TEXT('H')}}, {IDM_ETIRER, TEXT("tirer la vido"), TEXT("Aff tirer"), {false, false, false, TEXT('E')}}, -#ifdef _DEBUG +#ifdef _DIAGNOSTIC {IDM_RUN_GRAPH, TEXT("Mettre le graphe en marche"), TEXT("Debug GrapheMarche"), {false, true, false, TEXT('R')}}, {IDM_PAUSE_GRAPH, TEXT("Mettre le graphe en pause"), TEXT("Debug GraphePause"), {false, true, true, TEXT('R')}}, {IDM_STOP_GRAPH, TEXT("Arrter le graphe"), TEXT("Debug GrapheArrt"), {true, true, false, TEXT('R')}}, Modifié: tags/pouchintv_mod-0.6.0/main.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/main.cpp 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/main.cpp 2009-12-23 13:38:02 UTC (rev 219) @@ -71,6 +71,8 @@ #endif #ifdef _DEBUG TEXT(" Debug") + #elif _DIAGNOSTIC + TEXT(" Diag") #endif TEXT(")"); @@ -1567,7 +1569,7 @@ } } -#ifdef _DEBUG +#ifdef _DIAGNOSTIC static void display_graph_state() { if (!pGraph) @@ -1907,7 +1909,7 @@ do_web_update(hMainWnd); break; -#ifdef _DEBUG +#ifdef _DIAGNOSTIC case IDM_GRAPH_STATE: display_graph_state(); break; @@ -1954,7 +1956,7 @@ debranche(); } break; -#endif // #ifdef _DEBUG +#endif // #ifdef _DIAGNOSTIC case IDM_APP_RESTART: save_config(); Modifié: tags/pouchintv_mod-0.6.0/search.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/search.cpp 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/search.cpp 2009-12-23 13:38:02 UTC (rev 219) @@ -282,14 +282,13 @@ tstring strPath; hr = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" - if (FAILED(hr)) { - myprintf(ERRX(TEXT("Erreur : impossible d'obtenir le device path pour %s, hr=0x%x")), cMnkb.strName.c_str(), hr); + if (FAILED(hr)) return S_OK; // Invalide : S_OK pour continuer chercher - } // Tenter d'ajouter le filtre au graphe + myprintf(TEXT("%*sEssai %s\n"), bFirst ? 4 : 6, TEXT(""), cMnkb.strName.c_str()); hr = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); - myprintf(TEXT("%*sEssai %s, hr=0x%x\n"), bFirst ? 4 : 6, TEXT(""), cMnkb.strName.c_str(), hr); + myprintf(TEXT("%*s-- rsultat essai, hr=0x%x\n"), bFirst ? 4 : 6, TEXT(""), hr); if (FAILED(hr)) return S_OK; // Invalide : S_OK pour continuer chercher @@ -298,6 +297,7 @@ if (bFirst) { // Premier filtre rcepteur trouv : rechercher s'il n'y en a pas un second hr = CSearchReceiver(pTestGraph, false, vResult).Do(); + myprintf(TEXT(" -- rsultat recherche second rcepteur, hr=0x%x\n"), hr); // Si un filtre de capture a t trouv en 3me position, alors celui-ci est un filtre // dmodulateur @@ -307,6 +307,7 @@ // Ajout du filtre la position qui lui a t assigne vResult.asDev[eDevType].Set(cMnkb.strName.c_str(), strPath.c_str()); + myprintf(TEXT("%*sDevice path=\"%s\"\n"), bFirst ? 4 : 6, TEXT(""), vResult.asDev[eDevType].strPath.c_str()); // Retirer le filtre hr = pTestGraph->PopFilter(); @@ -339,7 +340,7 @@ if (pTestGraph.get()) { hr = pTestGraph->Build(); - myprintf(CMyP TEXT("Echec construction du graphe, code 0x%08x\n"), FAILED(hr), hr); + myprintf(CMyP ERRX(TEXT("chec construction du graphe, code 0x%08x")), FAILED(hr), hr); } } @@ -366,7 +367,7 @@ hr = pTestGraph->change_frequence(-1, -1); if (FAILED(hr)) { myprintf(ERRX(TEXT("Erreur : slection frquence impossible, hr=0x%x")), hr); - return hr; + // return hr; } } #endif @@ -374,14 +375,13 @@ tstring strPath; hr = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" - if (FAILED(hr)) { - myprintf(ERRX(TEXT("Erreur : impossible d'obtenir le device path pour %s, hr=0x%x")), cMnkb.strName.c_str(), hr); + if (FAILED(hr)) return S_OK; // Invalide : S_OK pour continuer chercher - } // Tenter d'ajouter le filtre au graphe + myprintf(TEXT(" Essai %s\n"), cMnkb.strName.c_str()); hr = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); - myprintf(TEXT(" Essai %s, hr=0x%x\n"), cMnkb.strName.c_str(), hr); + myprintf(TEXT(" -- rsultat essai, hr=0x%x\n"), hr); if (FAILED(hr)) return S_OK; // chec : on retourne nanmoins avec S_OK (pour continuer chercher) @@ -389,8 +389,10 @@ DeviceInfo sInf; sInf.asDev[dt_Tuner].Set(cMnkb.strName.c_str(), strPath.c_str()); + myprintf(TEXT(" Device path=\"%s\"\n"), sInf.asDev[dt_Tuner].strPath.c_str()); // Chercher les filtres matriels supplmentaires qui pourraient tre requis hr = CSearchReceiver(pTestGraph.get(), dt_Demod, sInf).Do(); + myprintf(TEXT(" -- rsultat recherche rcepteur, hr=0x%x\n"), hr); // Retirer le filtre tuner HRESULT hr2 = pTestGraph->PopFilter(); Modifié: tags/pouchintv_mod-0.6.0/update.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/update.cpp 2009-12-20 23:23:38 UTC (rev 218) +++ tags/pouchintv_mod-0.6.0/update.cpp 2009-12-23 13:38:02 UTC (rev 219) @@ -769,9 +769,9 @@ AddProgress(); GetInternetFile(TEXT(UPDATE_URL), vBytVersion, eUpda_Check); // Objet traitant de la connexion Internet -#ifdef _DEBUG +#ifdef _DIAGNOSTIC if (!vBytVersion.empty()) { - // Enregistrement du fichier XML reu, en compilation _DEBUG seulement + // Enregistrement du fichier XML reu, en compilation _DIAGNOSTIC seulement TempPathName sUpdateFileName("pouchin_update.xml"); SauveFichier(vBytVersion, sUpdateFileName); From pouchintv-dev at baysse.fr Sat Dec 26 02:06:08 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Sat, 26 Dec 2009 01:06:08 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r220 - in tags/pouchintv_mod-0.6.0: . tools tools/ConditionalHeaderGenerator tools/GeneRealVersion Message-ID: <20091226010556.E74545F75C@mail.baysse.fr> Author: gingko Date: 2009-12-26 02:05:55 +0100 (sam 26 déc 2009) New Revision: 220 Modified: tags/pouchintv_mod-0.6.0/filters.cpp tags/pouchintv_mod-0.6.0/ini.cpp tags/pouchintv_mod-0.6.0/search.cpp tags/pouchintv_mod-0.6.0/search.h tags/pouchintv_mod-0.6.0/tools/ConditionalHeaderGenerator.exe tags/pouchintv_mod-0.6.0/tools/ConditionalHeaderGenerator/ConditionalHeaderGenerator_2005.vcproj tags/pouchintv_mod-0.6.0/tools/ConditionalHeaderGenerator/ConditionalHeaderGenerator_2008.vcproj tags/pouchintv_mod-0.6.0/tools/GeneRealVersion.exe tags/pouchintv_mod-0.6.0/tools/GeneRealVersion/GeneRealVersion_2005.vcproj tags/pouchintv_mod-0.6.0/tools/GeneRealVersion/GeneRealVersion_2008.vcproj Log: Encore des correctifs concernant la version 0.6.0. search.h, search.cpp : * Correctif pour les quelques tuners (par ex. certains AF9015) qui n'étaient plus trouvés avec le nouveau système de recherche. * Ajout de quelques tests d'erreur. ini.cpp : * Correctif dans "check_config" : un tuner USB débranché était toujours identifié comme présent, reportant l'erreur à la construction du graphe. search.h, filters.cpp : * Petits oublis ... ConditionalHeaderGenerator, GeneralVersion : * Remplacement de ces utilitaires par des versions linkées statiquement, plus volumineux mais moins susceptibles de ne pas fonctionner pour cause de bibliothèques C++ (de la bonne version) non disponibles, situation que je rencontrais hélas trop souvent. Modifié: tags/pouchintv_mod-0.6.0/filters.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/filters.cpp 2009-12-23 13:38:02 UTC (rev 219) +++ tags/pouchintv_mod-0.6.0/filters.cpp 2009-12-26 01:05:55 UTC (rev 220) @@ -256,7 +256,7 @@ CComVariant varName; hr = pPropBag->Read(L"FriendlyName", &varName, &cErrLog); - myprintf(CMyP ERRX(TEXT("Erreur Lecture nom du filtre, hr=0x%08x")), FAILED(hr), hr); + myprintf(CMyP ERRX(TEXT("Erreur lecture nom du filtre, hr=0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) strcpy_T(strName, VarStr_helper(varName)()); Modifié: tags/pouchintv_mod-0.6.0/ini.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/ini.cpp 2009-12-23 13:38:02 UTC (rev 219) +++ tags/pouchintv_mod-0.6.0/ini.cpp 2009-12-26 01:05:55 UTC (rev 220) @@ -2656,6 +2656,26 @@ } /** + * Vrification de la validit d'un device path. + * \param[in] pszDevPath device path vrifier. + **/ +bool check_path(LPCTSTR pszDevPath) +{ + HRESULT hr; + MonikerBindings cMnkb(szPathDemod, &hr); + + if (!cMnkb.isOk() || FAILED(hr)) + return false; + + // S'assurer qu'on peut rellement crer le filtre (ce qui ne sera pas le cas + // si le tuner a t retir) : + hr = cMnkb.BindToFilter(); + if (FAILED(hr)) + return false; + return true; +} + +/** * Vrification de la validit de la configuration du tuner TNT. * * \retval true si le tuner configur est valide @@ -2665,22 +2685,20 @@ { #if ADVANCED_TUNER_SEARCH if (!IsNullName(szPathTuner)) { - HRESULT hr; - // Au moins un chemin tuner a t spcifi. // Vrifier qu'il correspond bien un tuner valide et prsent - if (!MonikerBindings(szPathTuner, &hr).isOk() || FAILED(hr)) + if (!check_path(szPathTuner)) return false; // S'il y a un filtre dmodulateur, il doit tre valide if (!IsNullName(szPathDemod)) { - if (!MonikerBindings(szPathDemod, &hr).isOk() || FAILED(hr)) + if (!check_path(szPathDemod)) return false; } // S'il y a un filtre de capture, il doit tre valide if (!IsNullName(szPathCapture)) { - if (!MonikerBindings(szPathCapture, &hr).isOk() || FAILED(hr)) + if (!check_path(szPathCapture)) return false; } Modifié: tags/pouchintv_mod-0.6.0/search.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/search.cpp 2009-12-23 13:38:02 UTC (rev 219) +++ tags/pouchintv_mod-0.6.0/search.cpp 2009-12-26 01:05:55 UTC (rev 220) @@ -234,6 +234,9 @@ if (hr != S_OK) return hr; // Il y a eu une erreur l'initialisation + if (!pEnumMoniker) + return S_FALSE; + // numration des "monikers". for (ENUM_ITF(pEnumMoniker, IMoniker, pMoniker)) { MonikerBindings cMnkb(pMoniker, &hr); @@ -278,26 +281,26 @@ **/ HRESULT CSearchTuner::CSearchReceiver::ApplyOne(MonikerBindings & cMnkb) { - HRESULT hr; // Pour les codes d'erreur qu'on compte ne pas retourner + HRESULT hr2; // Pour les codes d'erreur qu'on compte ne pas retourner tstring strPath; - hr = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" - if (FAILED(hr)) + hr2 = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" + if (FAILED(hr2)) return S_OK; // Invalide : S_OK pour continuer chercher // Tenter d'ajouter le filtre au graphe myprintf(TEXT("%*sEssai %s\n"), bFirst ? 4 : 6, TEXT(""), cMnkb.strName.c_str()); - hr = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); - myprintf(TEXT("%*s-- rsultat essai, hr=0x%x\n"), bFirst ? 4 : 6, TEXT(""), hr); - if (FAILED(hr)) + hr2 = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); + myprintf(TEXT("%*s-- rsultat essai, hr=0x%x\n"), bFirst ? 4 : 6, TEXT(""), hr2); + if (FAILED(hr2)) return S_OK; // Invalide : S_OK pour continuer chercher DeviceType eDevType = dt_Capture; // dt_Capture par dfaut if (bFirst) { // Premier filtre rcepteur trouv : rechercher s'il n'y en a pas un second - hr = CSearchReceiver(pTestGraph, false, vResult).Do(); - myprintf(TEXT(" -- rsultat recherche second rcepteur, hr=0x%x\n"), hr); + hr2 = CSearchReceiver(pTestGraph, false, vResult).Do(); + myprintf(TEXT(" -- rsultat recherche second rcepteur, hr=0x%x\n"), hr2); // Si un filtre de capture a t trouv en 3me position, alors celui-ci est un filtre // dmodulateur @@ -310,8 +313,8 @@ myprintf(TEXT("%*sDevice path=\"%s\"\n"), bFirst ? 4 : 6, TEXT(""), vResult.asDev[eDevType].strPath.c_str()); // Retirer le filtre - hr = pTestGraph->PopFilter(); - myprintf(TEXT("%*sRetrait %s, hr=0x%x\n"), bFirst ? 4 : 6, TEXT(""), cMnkb.strName.c_str(), hr); + hr2 = pTestGraph->PopFilter(); + myprintf(TEXT("%*sRetrait %s, hr=0x%x\n"), bFirst ? 4 : 6, TEXT(""), cMnkb.strName.c_str(), hr2); // Retour avec S_FALSE pour indiquer qu'on arrte de chercher return S_FALSE; @@ -358,31 +361,31 @@ if (FAILED(hr)) return hr; // Erreur la construction - HRESULT hr; // Pour les codes d'erreur qu'on compte ne pas retourner + HRESULT hr2; // Pour les codes d'erreur qu'on compte ne pas retourner #if USE_TUNING_SPACE // Envoi d'un "tune request" (sauf si graphe alternatif, dans lequel // cette fonctionnalit n'est pas exploitable ce stade) if (!pTestGraph->isLegacyGraph()) { - hr = pTestGraph->change_frequence(-1, -1); - if (FAILED(hr)) { - myprintf(ERRX(TEXT("Erreur : slection frquence impossible, hr=0x%x")), hr); - // return hr; + hr2 = pTestGraph->change_frequence(-1, -1); + if (FAILED(hr2)) { + myprintf(ERRX(TEXT("Erreur : slection frquence impossible, hr=0x%x")), hr2); + // return hr2; } } #endif tstring strPath; - hr = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" - if (FAILED(hr)) + hr2 = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" + if (FAILED(hr2)) return S_OK; // Invalide : S_OK pour continuer chercher // Tenter d'ajouter le filtre au graphe myprintf(TEXT(" Essai %s\n"), cMnkb.strName.c_str()); - hr = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); - myprintf(TEXT(" -- rsultat essai, hr=0x%x\n"), hr); - if (FAILED(hr)) + hr2 = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); + myprintf(TEXT(" -- rsultat essai, hr=0x%x\n"), hr2); + if (FAILED(hr2)) return S_OK; // chec : on retourne nanmoins avec S_OK (pour continuer chercher) // Construction du rsultat @@ -391,17 +394,16 @@ sInf.asDev[dt_Tuner].Set(cMnkb.strName.c_str(), strPath.c_str()); myprintf(TEXT(" Device path=\"%s\"\n"), sInf.asDev[dt_Tuner].strPath.c_str()); // Chercher les filtres matriels supplmentaires qui pourraient tre requis - hr = CSearchReceiver(pTestGraph.get(), dt_Demod, sInf).Do(); - myprintf(TEXT(" -- rsultat recherche rcepteur, hr=0x%x\n"), hr); + hr2 = CSearchReceiver(pTestGraph.get(), dt_Demod, sInf).Do(); + myprintf(TEXT(" -- rsultat recherche rcepteur, hr=0x%x\n"), hr2); + // Retirer le filtre tuner - HRESULT hr2 = pTestGraph->PopFilter(); - + hr2 = pTestGraph->PopFilter(); myprintf(TEXT(" Retrait %s, hr=0x%x\n"), cMnkb.strName.c_str(), hr2); // Ajouter le rsultat l'ensembles des rsultats de la liste - if (SUCCEEDED(hr)) - vResults.push_back(sInf); + vResults.push_back(sInf); return S_OK; } @@ -414,11 +416,13 @@ { HRESULT hr = __super::Do(); - // Recherche et marquage des filtres qui auraient des noms de tuners identiques - vResults.FindDuplicates(); + if (hr == S_OK) { + // Recherche et marquage des filtres qui auraient des noms de tuners identiques + vResults.FindDuplicates(); - // Tri de la liste - sort(vResults.begin(), vResults.end()); + // Tri de la liste + sort(vResults.begin(), vResults.end()); + } return hr; } Modifié: tags/pouchintv_mod-0.6.0/search.h =================================================================== --- tags/pouchintv_mod-0.6.0/search.h 2009-12-23 13:38:02 UTC (rev 219) +++ tags/pouchintv_mod-0.6.0/search.h 2009-12-26 01:05:55 UTC (rev 220) @@ -447,6 +447,10 @@ * \return Code d'erreur DirectShow **/ HRESULT Do(); + + virtual ~CSearchTuner() { + myprintf(TEXT("Fin recherche tuners, destruction du graphe\n")); + /* Note : c'est le destructeur de auto_ptr qui dtruit le graphe */ } }; #endif // #if ADVANCED_TUNER_SEARCH Modifié: tags/pouchintv_mod-0.6.0/tools/ConditionalHeaderGenerator/ConditionalHeaderGenerator_2005.vcproj =================================================================== --- tags/pouchintv_mod-0.6.0/tools/ConditionalHeaderGenerator/ConditionalHeaderGenerator_2005.vcproj 2009-12-23 13:38:02 UTC (rev 219) +++ tags/pouchintv_mod-0.6.0/tools/ConditionalHeaderGenerator/ConditionalHeaderGenerator_2005.vcproj 2009-12-26 01:05:55 UTC (rev 220) @@ -43,7 +43,7 @@ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" MinimalRebuild="true" BasicRuntimeChecks="3" - RuntimeLibrary="3" + RuntimeLibrary="1" UsePrecompiledHeader="0" WarningLevel="3" DebugInformationFormat="4" @@ -116,7 +116,7 @@ Author: gingko Date: 2009-12-26 02:47:30 +0100 (sam 26 dc 2009) New Revision: 221 Modified: tags/pouchintv_mod-0.6.0/changelog.html tags/pouchintv_mod-0.6.0/ini.cpp tags/pouchintv_mod-0.6.0/resource.h Log: Version 0.6.0 : ini.cpp : * Rectification petite erreur compltement stupide, mais suffisante pour que plus rien ne marche dans la rvision 220. resource.h : * Le suffixe "RC" devient "RC2". Modifi: tags/pouchintv_mod-0.6.0/changelog.html =================================================================== --- tags/pouchintv_mod-0.6.0/changelog.html 2009-12-26 01:05:55 UTC (rev 220) +++ tags/pouchintv_mod-0.6.0/changelog.html 2009-12-26 01:47:30 UTC (rev 221) @@ -57,6 +57,17 @@

        Changements raliss pour la version 0.6

        +
        0.6.0.221 RC2 (publie dans le forum le 26 dcembre 2009) :
        +
          +
        • Certaines colorisations de l'EPG sont rendues lgrement plus fonces.
        • +
        • Correction de bugs :
            +
          • Certains tuners n'taient plus trouvs dans la recherche.
          • +
          • Duplicatas dans les noms de quatre codes de raccourcis.
          • +
          • Un tuner dbranch tait toujours identifi comme prsent, reportant l'erreur + la construction du graphe.
        • +
        +
        +
        0.6.0.216 RC (publie dans le forum le 19 dcembre 2009) :
        • Ajout de colorisations dans les ranges de la fentre EPG :
            Modifi: tags/pouchintv_mod-0.6.0/ini.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/ini.cpp 2009-12-26 01:05:55 UTC (rev 220) +++ tags/pouchintv_mod-0.6.0/ini.cpp 2009-12-26 01:47:30 UTC (rev 221) @@ -2662,7 +2662,7 @@ bool check_path(LPCTSTR pszDevPath) { HRESULT hr; - MonikerBindings cMnkb(szPathDemod, &hr); + MonikerBindings cMnkb(pszDevPath, &hr); if (!cMnkb.isOk() || FAILED(hr)) return false; Modifi: tags/pouchintv_mod-0.6.0/resource.h =================================================================== --- tags/pouchintv_mod-0.6.0/resource.h 2009-12-26 01:05:55 UTC (rev 220) +++ tags/pouchintv_mod-0.6.0/resource.h 2009-12-26 01:47:30 UTC (rev 221) @@ -256,7 +256,7 @@ #define IDM_BRANCHE 40094 // debug #define IDM_DEBRANCHE 40095 // debug -#define PTVM_VERSION_SUFFIX " RC" // temporaire +#define PTVM_VERSION_SUFFIX " RC2" // temporaire // Next default values for new objects // From pouchintv-dev at baysse.fr Sat Dec 26 03:13:56 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Sat, 26 Dec 2009 02:13:56 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r222 - in trunk: . tools tools/ConditionalHeaderGenerator tools/GeneRealVersion Message-ID: <20091226021346.31F505F758@mail.baysse.fr> Author: gingko Date: 2009-12-26 03:13:45 +0100 (sam 26 déc 2009) New Revision: 222 Modified: trunk/Pouchin TV_2005.sln trunk/Pouchin TV_2005.vcproj trunk/Pouchin TV_2008.sln trunk/Pouchin TV_2008.vcproj trunk/Programme_Install.nsi trunk/Setup_2005.vcproj trunk/Setup_2008.vcproj trunk/changelog.html trunk/config.h trunk/console.cpp trunk/epg.cpp trunk/filters.cpp trunk/graph.cpp trunk/graph.h trunk/ini.cpp trunk/main.cpp trunk/resource.h trunk/search.cpp trunk/search.h trunk/tools/ConditionalHeaderGenerator.exe trunk/tools/ConditionalHeaderGenerator/ConditionalHeaderGenerator_2005.vcproj trunk/tools/ConditionalHeaderGenerator/ConditionalHeaderGenerator_2008.vcproj trunk/tools/GeneRealVersion.exe trunk/tools/GeneRealVersion/GeneRealVersion_2005.vcproj trunk/tools/GeneRealVersion/GeneRealVersion_2008.vcproj trunk/update.cpp trunk/version trunk/version.rc2 Log: Report dans le tronc principal des modifications faites dans la branche de la version 0.6.0. Retrait du suffixe RC dans le numéro de version, et incrément de celui-ci à 1.6.1 en vue des évolutions à venir dans ce tronc principal. Modifié: trunk/Pouchin TV_2005.sln =================================================================== --- trunk/Pouchin TV_2005.sln 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/Pouchin TV_2005.sln 2009-12-26 02:13:45 UTC (rev 222) @@ -21,6 +21,8 @@ Debug_SBCS|x64 = Debug_SBCS|x64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Diagnostic|Win32 = Diagnostic|Win32 + Diagnostic|x64 = Diagnostic|x64 Release_SBCS|Win32 = Release_SBCS|Win32 Release_SBCS|x64 = Release_SBCS|x64 Release|Win32 = Release|Win32 @@ -35,6 +37,10 @@ {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|Win32.Build.0 = Debug|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|x64.ActiveCfg = Debug|x64 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|x64.Build.0 = Debug|x64 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|Win32.ActiveCfg = Diagnostic|Win32 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|Win32.Build.0 = Diagnostic|Win32 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|x64.ActiveCfg = Diagnostic|x64 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|x64.Build.0 = Diagnostic|x64 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|Win32.ActiveCfg = Release_SBCS|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|Win32.Build.0 = Release_SBCS|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|x64.ActiveCfg = Release_SBCS|x64 @@ -51,6 +57,10 @@ {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|Win32.Build.0 = Debug|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|x64.ActiveCfg = Debug|x64 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|x64.Build.0 = Debug|x64 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|Win32.ActiveCfg = Release|Win32 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|Win32.Build.0 = Release|Win32 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|x64.ActiveCfg = Release|x64 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|x64.Build.0 = Release|x64 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|Win32.ActiveCfg = Release_MBCS|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|Win32.Build.0 = Release_MBCS|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|x64.ActiveCfg = Release_MBCS|x64 @@ -67,6 +77,10 @@ {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|Win32.Build.0 = Debug|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|x64.ActiveCfg = Debug|x64 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|x64.Build.0 = Debug|x64 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|Win32.ActiveCfg = Release|Win32 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|Win32.Build.0 = Release|Win32 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|x64.ActiveCfg = Release|x64 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|x64.Build.0 = Release|x64 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|Win32.ActiveCfg = Release|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|Win32.Build.0 = Release|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|x64.ActiveCfg = Release|x64 @@ -79,6 +93,8 @@ {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug_SBCS|x64.ActiveCfg = Debug_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug|Win32.ActiveCfg = Debug|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug|x64.ActiveCfg = Debug|Win32 + {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Diagnostic|Win32.ActiveCfg = Diagnostic|Win32 + {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Diagnostic|x64.ActiveCfg = Diagnostic|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release_SBCS|Win32.ActiveCfg = Release_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release_SBCS|x64.ActiveCfg = Release_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release|Win32.ActiveCfg = Release|Win32 Modifié: trunk/Pouchin TV_2005.vcproj =================================================================== --- trunk/Pouchin TV_2005.vcproj 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/Pouchin TV_2005.vcproj 2009-12-26 02:13:45 UTC (rev 222) @@ -68,7 +68,7 @@ /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1054,6 +1245,10 @@ > + + Modifié: trunk/Pouchin TV_2008.sln =================================================================== --- trunk/Pouchin TV_2008.sln 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/Pouchin TV_2008.sln 2009-12-26 02:13:45 UTC (rev 222) @@ -21,6 +21,8 @@ Debug_SBCS|x64 = Debug_SBCS|x64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Diagnostic|Win32 = Diagnostic|Win32 + Diagnostic|x64 = Diagnostic|x64 Release_SBCS|Win32 = Release_SBCS|Win32 Release_SBCS|x64 = Release_SBCS|x64 Release|Win32 = Release|Win32 @@ -35,6 +37,10 @@ {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|Win32.Build.0 = Debug|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|x64.ActiveCfg = Debug|x64 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Debug|x64.Build.0 = Debug|x64 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|Win32.ActiveCfg = Diagnostic|Win32 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|Win32.Build.0 = Diagnostic|Win32 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|x64.ActiveCfg = Diagnostic|x64 + {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Diagnostic|x64.Build.0 = Diagnostic|x64 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|Win32.ActiveCfg = Release_SBCS|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|Win32.Build.0 = Release_SBCS|Win32 {E40974CC-65ED-4E0D-A2E2-3885C2C8A25B}.Release_SBCS|x64.ActiveCfg = Release_SBCS|x64 @@ -51,6 +57,10 @@ {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|Win32.Build.0 = Debug|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|x64.ActiveCfg = Debug|x64 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Debug|x64.Build.0 = Debug|x64 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|Win32.ActiveCfg = Release|Win32 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|Win32.Build.0 = Release|Win32 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|x64.ActiveCfg = Release|x64 + {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Diagnostic|x64.Build.0 = Release|x64 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|Win32.ActiveCfg = Release_MBCS|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|Win32.Build.0 = Release_MBCS|Win32 {E8A3F6FA-AE1C-4C8E-A0B6-9C8480324EAA}.Release_SBCS|x64.ActiveCfg = Release_MBCS|x64 @@ -67,6 +77,10 @@ {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|Win32.Build.0 = Debug|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|x64.ActiveCfg = Debug|x64 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Debug|x64.Build.0 = Debug|x64 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|Win32.ActiveCfg = Release|Win32 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|Win32.Build.0 = Release|Win32 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|x64.ActiveCfg = Release|x64 + {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Diagnostic|x64.Build.0 = Release|x64 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|Win32.ActiveCfg = Release|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|Win32.Build.0 = Release|Win32 {C406DAEC-0886-4771-8DEA-9D7329B46CC1}.Release_SBCS|x64.ActiveCfg = Release|x64 @@ -79,6 +93,8 @@ {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug_SBCS|x64.ActiveCfg = Debug_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug|Win32.ActiveCfg = Debug|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Debug|x64.ActiveCfg = Debug|Win32 + {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Diagnostic|Win32.ActiveCfg = Diagnostic|Win32 + {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Diagnostic|x64.ActiveCfg = Diagnostic|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release_SBCS|Win32.ActiveCfg = Release_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release_SBCS|x64.ActiveCfg = Release_SBCS|Win32 {0A1A8A49-A616-442F-A2A9-007ED24AB66A}.Release|Win32.ActiveCfg = Release|Win32 Modifié: trunk/Pouchin TV_2008.vcproj =================================================================== --- trunk/Pouchin TV_2008.vcproj 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/Pouchin TV_2008.vcproj 2009-12-26 02:13:45 UTC (rev 222) @@ -69,7 +69,7 @@ /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1047,6 +1236,10 @@ > + + Modifié: trunk/Programme_Install.nsi =================================================================== --- trunk/Programme_Install.nsi 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/Programme_Install.nsi 2009-12-26 02:13:45 UTC (rev 222) @@ -53,7 +53,7 @@ ;$DEBUG_SFX est un suffixe ajout au nom de l'application et de l'installeur pour ;diffrencier les versions Debug ;Cette variable est dfinir est dfinir par /DDEBUG_SFX=xxxx en ligne de commande - ;Normalement vide (par dfaut) ou bien "_debug" + ;Normalement vide (par dfaut) ou bien "_debug" ou "_diag" !ifndef DEBUG_SFX !define DEBUG_SFX "" !endif @@ -61,7 +61,7 @@ ;$DSPDBG_SFX est un suffixe ajout au nom des rpertoires et des raccourcis du menu dmarrer ;pour diffrencier les versions Debug ;Cette variable est dfinir est dfinir par /DDSPDBG_SFX=xxxx en ligne de commande - ;Normalement vide (par dfaut) ou bien " (debug)" + ;Normalement vide (par dfaut) ou bien " (debug)" ou " (diag)" !ifndef DSPDBG_SFX !define DSPDBG_SFX "" !endif Modifié: trunk/Setup_2005.vcproj =================================================================== --- trunk/Setup_2005.vcproj 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/Setup_2005.vcproj 2009-12-26 02:13:45 UTC (rev 222) @@ -22,6 +22,18 @@ CharacterSet="0" WholeProgramOptimization="0" > + + + + + + + + + + + + + + + + + + + + + + @@ -67,7 +136,7 @@ @@ -78,7 +147,7 @@ @@ -89,7 +158,7 @@ @@ -100,11 +169,22 @@ + + + Modifié: trunk/Setup_2008.vcproj =================================================================== --- trunk/Setup_2008.vcproj 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/Setup_2008.vcproj 2009-12-26 02:13:45 UTC (rev 222) @@ -24,6 +24,18 @@ WholeProgramOptimization="0" EnableManagedIncrementalBuild="0" > + + + + + + + + + + + + + + + + + + + + + + @@ -72,7 +142,7 @@ @@ -83,7 +153,7 @@ @@ -94,7 +164,7 @@ @@ -105,11 +175,22 @@ + + + Modifié: trunk/changelog.html =================================================================== --- trunk/changelog.html 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/changelog.html 2009-12-26 02:13:45 UTC (rev 222) @@ -57,6 +57,17 @@

            Changements réalisés pour la version 0.6

            +
            0.6.0.221 RC2 (publiée dans le forum le 26 décembre 2009) :
            +
              +
            • Certaines colorisations de l'EPG sont rendues légèrement plus foncées.
            • +
            • Correction de bugs :
                +
              • Certains tuners n'étaient plus trouvés dans la recherche.
              • +
              • Duplicatas dans les noms de quatre codes de raccourcis.
              • +
              • Un tuner débranché était toujours identifié comme présent, reportant l'erreur + à la construction du graphe.
            • +
            +
            +
            0.6.0.216 RC (publiée dans le forum le 19 décembre 2009) :
            • Ajout de colorisations dans les rangées de la fenêtre EPG :
                Modifié: trunk/config.h =================================================================== --- trunk/config.h 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/config.h 2009-12-26 02:13:45 UTC (rev 222) @@ -118,7 +118,7 @@ /** * Activation / dsactivation de la journalisation dans DirectShow **/ -#ifdef _DEBUG +#ifdef _DIAGNOSTIC #define LOG_DSHOW 1 #else #define LOG_DSHOW 0 Modifié: trunk/console.cpp =================================================================== --- trunk/console.cpp 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/console.cpp 2009-12-26 02:13:45 UTC (rev 222) @@ -34,6 +34,7 @@ ********************************************************************************************/ #include "console.h" +#include "main.h" #include #include #include @@ -55,8 +56,23 @@ hConsMutex(NULL), f(NULL), nFileRes(0) - {} + { + } + /** + * Interception d'un clic sur la case de fermeture de la console, et transformation en + * fermeture de la fentre principale (ceci permet de s'assurer que les mises jour faites + * la fermeture de l'application sont effectues proprement). + **/ + static BOOL WINAPI HandlerRoutine(DWORD dwCtrlType) + { + if (dwCtrlType == CTRL_CLOSE_EVENT) { + PostMessage(hMainWnd, WM_CLOSE, 0, NULL); + return TRUE; + } + return FALSE; + } + /// Sortie brute d'un message vers la console void RawOutput(LPCTSTR pszMsg); @@ -265,10 +281,11 @@ { if (alloc) { AllocConsole(); - SetConsoleTitle(TEXT("Debug Window")); + SetConsoleTitle(TEXT("Fentre de diagnostic de Pouchin TV Mod")); } hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); hConsMutex = CreateMutex(NULL, FALSE, NULL); + SetConsoleCtrlHandler(HandlerRoutine, TRUE); } void startConsoleWin(bool alloc) Modifié: trunk/epg.cpp =================================================================== --- trunk/epg.cpp 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/epg.cpp 2009-12-26 02:13:45 UTC (rev 222) @@ -620,9 +620,9 @@ SYSTEMTIME localtime; if (sRow.ixChaine == ixChaineCourante) - sNlcd.clrTextBk = RGB(208,255,208); // Chane courante : fond teint de vert + sNlcd.clrTextBk = RGB(192,255,192); // Chane courante : fond teint de vert else if (sRow.khz == Canaux[ixChaineCourante].khz) - sNlcd.clrTextBk = RGB(255,255,224); // Mme multiplex : fond teint de jaune + sNlcd.clrTextBk = RGB(255,255,208); // Mme multiplex : fond teint de jaune GetLocalTime(&localtime); Modifié: trunk/filters.cpp =================================================================== --- trunk/filters.cpp 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/filters.cpp 2009-12-26 02:13:45 UTC (rev 222) @@ -218,6 +218,7 @@ { HRESULT hr = CreateBindCtx(0, &pBindCtx); + myprintf(CMyP ERRX(TEXT("chec CreateBindCtx, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) hr = BindProperties(); @@ -255,7 +256,7 @@ CComVariant varName; hr = pPropBag->Read(L"FriendlyName", &varName, &cErrLog); - myprintf(CMyP ERRX(TEXT("Erreur Lecture nom du filtre, hr=0x%08x")), FAILED(hr), hr); + myprintf(CMyP ERRX(TEXT("Erreur lecture nom du filtre, hr=0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) strcpy_T(strName, VarStr_helper(varName)()); @@ -322,7 +323,6 @@ LPWSTR pszDisplayName; HRESULT hr = pMoniker->GetDisplayName(pBindCtx, NULL, &pszDisplayName); - if (SUCCEEDED(hr)) { strcpy_T(strDevicePath, pszDisplayName); @@ -387,7 +387,7 @@ HRESULT hr = pFilter->EnumPins(&pEnumPins); if (FAILED(hr)) { - myprintf(ERRX(TEXT("Erreur cherche_pin/EnumPins hr=0x%08x")), hr); + myprintf(ERRX(TEXT("Erreur cherche_pin/EnumPins(%i) hr=0x%08x")), dir, hr); return hr; } @@ -395,7 +395,7 @@ PIN_DIRECTION direction; if (FAILED(hr = pPin->QueryDirection(&direction))) { - myprintf(ERRX(TEXT("Erreur cherche_pin/QueryDirection, hr=0x%08x")), hr); + myprintf(ERRX(TEXT("Erreur cherche_pin/QueryDirection(%i), hr=0x%08x")), dir, hr); break; } @@ -411,7 +411,7 @@ break; } } else if (FAILED(hr)) { - myprintf(ERRX(TEXT("Erreur cherche_pin/ConnectedTo, hr=0x%08x")), hr); + myprintf(ERRX(TEXT("Erreur cherche_pin/ConnectedTo(%i), hr=0x%08x")), dir, hr); break; } } else { Modifié: trunk/graph.cpp =================================================================== --- trunk/graph.cpp 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/graph.cpp 2009-12-26 02:13:45 UTC (rev 222) @@ -370,6 +370,7 @@ if (pDVBTuningSpace) { //Get new TuneRequest from tuning space hr = pDVBTuningSpace->CreateTuneRequest(&pTuneRequest); + myprintf(CMyP ERRX(TEXT("chec CreateTuneRequest, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) { //Get interface to the TuneRequest CComQIPtr pDVBTuneRequest(pTuneRequest); @@ -378,20 +379,30 @@ CComPtr pDVBTLocator; hr = pDVBTLocator.CoCreateInstance(CLSID_DVBTLocator); + myprintf(CMyP ERRX(TEXT("chec pDVBTLocator.CoCreateInstance, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) { hr = pDVBTLocator->put_CarrierFrequency(frequency); + myprintf(CMyP ERRX(TEXT("chec put_CarrierFrequency, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) { hr = pDVBTLocator->put_Bandwidth(bandwidth); + myprintf(CMyP ERRX(TEXT("chec put_Bandwidth, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) { // Bind the locator to the tune request. hr = pDVBTuneRequest->put_Locator(pDVBTLocator); + myprintf(CMyP ERRX(TEXT("chec put_Locator, code 0x%08x")), FAILED(hr), hr); - if (SUCCEEDED(hr)) + if (SUCCEEDED(hr)) { hr = pDVBTuneRequest->put_ONID(ONID); - if (SUCCEEDED(hr)) + myprintf(CMyP ERRX(TEXT("chec put_ONID, code 0x%08x")), FAILED(hr), hr); + } + if (SUCCEEDED(hr)) { hr = pDVBTuneRequest->put_TSID(TSID); - if (SUCCEEDED(hr)) + myprintf(CMyP ERRX(TEXT("chec put_TSID, code 0x%08x")), FAILED(hr), hr); + } + if (SUCCEEDED(hr)) { hr = pDVBTuneRequest->put_SID(SID); + myprintf(CMyP ERRX(TEXT("chec put_SID, code 0x%08x")), FAILED(hr), hr); + } } } } @@ -546,7 +557,7 @@ /// Construction du graphe virtual HRESULT Build(); - #ifdef _DEBUG + #ifdef _DIAGNOSTIC virtual tstring get_graph_state(); #endif @@ -658,8 +669,10 @@ CComPtr pInPin; HRESULT hr = cherche_pin(pFilter, PINDIR_INPUT, pInPin, NOTCONNECTED); + myprintf(CMyP ERRX(TEXT("chec connect_pin_to_filter/cherche_pin(IN), code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) { hr = pFGrph->ConnectDirect(pOutPin, pInPin, NULL); + myprintf(CMyP ERRX(TEXT("chec connect_pin_to_filter/ConnectDirect, code 0x%08x")), FAILED(hr), hr); } return hr; } @@ -676,6 +689,7 @@ CComPtr pOutPin; HRESULT hr = cherche_pin(source, PINDIR_OUTPUT, pOutPin); + myprintf(CMyP ERRX(TEXT("chec connect_filters/cherche_pin(OUT), code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) hr = connect_pin_to_filter(pOutPin, dest); return hr; @@ -701,7 +715,7 @@ return pFGrph->Disconnect(pInPin); } -#ifdef _DEBUG +#ifdef _DIAGNOSTIC tstring CPTvM_GraphBase::get_graph_state() { OAFilterState state = graph_GetState(); @@ -798,7 +812,7 @@ **/ static HRESULT Search_IBDA_Topology(const CComPtr & pTuner, REFIID iid, CComPtr & pUnk); -#ifdef _DEBUG +#ifdef _DIAGNOSTIC static HRESULT View_IBDA_Topology(const CComPtr & pTuner); #endif @@ -1248,7 +1262,10 @@ if (!pTuner) return E_NOINTERFACE; - return pTuner->put_TuneRequest(pTuneRequest); + HRESULT hr = pTuner->put_TuneRequest(pTuneRequest); + + myprintf(CMyP ERRX(TEXT("chec put_TuneRequest, code 0x%08x")), FAILED(hr), hr); + return hr; } /** @@ -1378,7 +1395,7 @@ return hr; } -#ifdef _DEBUG +#ifdef _DIAGNOSTIC HRESULT CPTvM_TunerGraph::View_IBDA_Topology(const CComPtr & pTuner) { @@ -1894,15 +1911,21 @@ { HRESULT hr = AddFilterToGraph(pFilter, pszName); - if (FAILED(hr)) + if (FAILED(hr)) { + myprintf(ERRX(TEXT("chec PushFilter/AddFilterToGraph, code 0x%08x")), hr); return hr; + } hr = connect_filters(pTailFilter, pFilter); + myprintf(CMyP ERRX(TEXT("chec PushFilter/connect_filters, code 0x%08x")), FAILED(hr), hr); if (SUCCEEDED(hr)) pTailFilter = pFilter; - else - pFGrph->RemoveFilter(pFilter); + else { + HRESULT hr2 = pFGrph->RemoveFilter(pFilter); + myprintf(CMyP ERRX(TEXT("chec PushFilter/RemoveFilter, code 0x%08x")), FAILED(hr2), hr2); + } + return hr; } @@ -1920,6 +1943,7 @@ CComPtr pInPin; hr = cherche_pin(pTailFilter, PINDIR_INPUT, pInPin); + myprintf(CMyP ERRX(TEXT("chec PopFilter/cherche_pin(IN), code 0x%08x")), FAILED(hr), hr); if (FAILED(hr)) return hr; @@ -1927,11 +1951,14 @@ // Trouver la broche de sortie du filtre auquel il est connect hr = pInPin->ConnectedTo(&pOutPin); - if (FAILED(hr)) + if (FAILED(hr)) { + myprintf(ERRX(TEXT("chec PopFilter/ConnectedTo, code 0x%08x")), hr); return hr; + } // Trouver quel fitre appartient cette broche de sortie hr = pOutPin->QueryPinInfo(&pin_info); + myprintf(CMyP ERRX(TEXT("chec PopFilter/QueryPinInfo, code 0x%08x")), FAILED(hr), hr); if (pin_info.pFilter) pin_info.pFilter->Release(); // liminer la rfrence en suspens (le pointeur reste valide) // Ignorer le code retour : si pas de filtre, pTailFilter sera NULL @@ -1940,8 +1967,10 @@ // Retirer le filtre hr = pFGrph->RemoveFilter(pTailFilter); - if (FAILED(hr)) + if (FAILED(hr)) { + myprintf(ERRX(TEXT("chec PopFilter/RemoveFilter, code 0x%08x")), hr); return hr; + } // Le filtre prcdent devient le dernier de la file pTailFilter = pin_info.pFilter; @@ -2020,7 +2049,7 @@ { HRESULT hr; - #ifdef _DEBUG + #ifdef _DIAGNOSTIC View_IBDA_Topology(pNetworkTuner); #endif Modifié: trunk/graph.h =================================================================== --- trunk/graph.h 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/graph.h 2009-12-26 02:13:45 UTC (rev 222) @@ -137,7 +137,7 @@ **/ virtual bool graph_isRunning() const = 0; -#ifdef _DEBUG +#ifdef _DIAGNOSTIC virtual tstring get_graph_state() = 0; #endif EndInterface Modifié: trunk/ini.cpp =================================================================== --- trunk/ini.cpp 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/ini.cpp 2009-12-26 02:13:45 UTC (rev 222) @@ -60,8 +60,8 @@ {IDM_CHAN_AUG, TEXT("Chane suivante"), TEXT("Chane suiv"), {false, false, false, VK_DOWN}}, {IDM_CHAN_DIM, TEXT("Chane prcdente"), TEXT("Chane prc"), {false, false, false, VK_UP}}, {IDM_LAST_CHAN, TEXT("Retour dernire chane vue"), TEXT("Chane retour"), {false, false, false, VK_BACK}}, - {IDM_CHAN_AUG_MPX, TEXT("Chane suivante du multiplex"), TEXT("Chane suiv"), {true, false, false, VK_DOWN}}, - {IDM_CHAN_DIM_MPX, TEXT("Chane prcdente du multiplex"), TEXT("Chane prc"), {true, false, false, VK_UP}}, + {IDM_CHAN_AUG_MPX, TEXT("Chane suivante du multiplex"), TEXT("Chane suiv mx"), {true, false, false, VK_DOWN}}, + {IDM_CHAN_DIM_MPX, TEXT("Chane prcdente du multiplex"), TEXT("Chane prc mx"), {true, false, false, VK_UP}}, {IDM_CHAN_TUNE, TEXT("Forcer une resyntonisation"), TEXT("Chane Resyntoniser"),{false, true, false, TEXT('F')}}, // EPG {IDM_EPG, TEXT("Guide des programmes"), TEXT("EPG Guide progs"), {false, false, false, TEXT('G')}}, @@ -92,7 +92,7 @@ {IDM_ALLWDT, TEXT("Utiliser toute la largeur"), TEXT("Aff Pleine largeur"), {false, false, false, TEXT('W')}}, {IDM_ALLHGT, TEXT("Utiliser toute la hauteur"), TEXT("Aff Pleine hauteur"), {false, false, false, TEXT('H')}}, {IDM_ETIRER, TEXT("tirer la vido"), TEXT("Aff tirer"), {false, false, false, TEXT('E')}}, -#ifdef _DEBUG +#ifdef _DIAGNOSTIC {IDM_RUN_GRAPH, TEXT("Mettre le graphe en marche"), TEXT("Debug GrapheMarche"), {false, true, false, TEXT('R')}}, {IDM_PAUSE_GRAPH, TEXT("Mettre le graphe en pause"), TEXT("Debug GraphePause"), {false, true, true, TEXT('R')}}, {IDM_STOP_GRAPH, TEXT("Arrter le graphe"), TEXT("Debug GrapheArrt"), {true, true, false, TEXT('R')}}, @@ -2656,6 +2656,26 @@ } /** + * Vrification de la validit d'un device path. + * \param[in] pszDevPath device path vrifier. + **/ +bool check_path(LPCTSTR pszDevPath) +{ + HRESULT hr; + MonikerBindings cMnkb(pszDevPath, &hr); + + if (!cMnkb.isOk() || FAILED(hr)) + return false; + + // S'assurer qu'on peut rellement crer le filtre (ce qui ne sera pas le cas + // si le tuner a t retir) : + hr = cMnkb.BindToFilter(); + if (FAILED(hr)) + return false; + return true; +} + +/** * Vrification de la validit de la configuration du tuner TNT. * * \retval true si le tuner configur est valide @@ -2665,22 +2685,20 @@ { #if ADVANCED_TUNER_SEARCH if (!IsNullName(szPathTuner)) { - HRESULT hr; - // Au moins un chemin tuner a t spcifi. // Vrifier qu'il correspond bien un tuner valide et prsent - if (!MonikerBindings(szPathTuner, &hr).isOk() || FAILED(hr)) + if (!check_path(szPathTuner)) return false; // S'il y a un filtre dmodulateur, il doit tre valide if (!IsNullName(szPathDemod)) { - if (!MonikerBindings(szPathDemod, &hr).isOk() || FAILED(hr)) + if (!check_path(szPathDemod)) return false; } // S'il y a un filtre de capture, il doit tre valide if (!IsNullName(szPathCapture)) { - if (!MonikerBindings(szPathCapture, &hr).isOk() || FAILED(hr)) + if (!check_path(szPathCapture)) return false; } Modifié: trunk/main.cpp =================================================================== --- trunk/main.cpp 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/main.cpp 2009-12-26 02:13:45 UTC (rev 222) @@ -58,7 +58,7 @@ * Texte de version de l'application **/ TCHAR szAppVersion[] = - TEXT(PTVM_VERSION_STR) TEXT( PTVM_VERSION_SUFFIX) TEXT(" (") + TEXT(PTVM_VERSION_STR) TEXT(" (") #ifdef _WIN64 TEXT("x64") #else @@ -71,6 +71,8 @@ #endif #ifdef _DEBUG TEXT(" Debug") + #elif _DIAGNOSTIC + TEXT(" Diag") #endif TEXT(")"); @@ -1567,7 +1569,7 @@ } } -#ifdef _DEBUG +#ifdef _DIAGNOSTIC static void display_graph_state() { if (!pGraph) @@ -1907,7 +1909,7 @@ do_web_update(hMainWnd); break; -#ifdef _DEBUG +#ifdef _DIAGNOSTIC case IDM_GRAPH_STATE: display_graph_state(); break; @@ -1954,7 +1956,7 @@ debranche(); } break; -#endif // #ifdef _DEBUG +#endif // #ifdef _DIAGNOSTIC case IDM_APP_RESTART: save_config(); Modifié: trunk/resource.h =================================================================== --- trunk/resource.h 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/resource.h 2009-12-26 02:13:45 UTC (rev 222) @@ -256,8 +256,6 @@ #define IDM_BRANCHE 40094 // debug #define IDM_DEBRANCHE 40095 // debug -#define PTVM_VERSION_SUFFIX " RC" // temporaire - // Next default values for new objects // #ifdef APSTUDIO_INVOKED Modifié: trunk/search.cpp =================================================================== --- trunk/search.cpp 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/search.cpp 2009-12-26 02:13:45 UTC (rev 222) @@ -234,6 +234,9 @@ if (hr != S_OK) return hr; // Il y a eu une erreur l'initialisation + if (!pEnumMoniker) + return S_FALSE; + // numration des "monikers". for (ENUM_ITF(pEnumMoniker, IMoniker, pMoniker)) { MonikerBindings cMnkb(pMoniker, &hr); @@ -278,23 +281,26 @@ **/ HRESULT CSearchTuner::CSearchReceiver::ApplyOne(MonikerBindings & cMnkb) { - HRESULT hr; // Pour les codes d'erreur qu'on compte ne pas retourner + HRESULT hr2; // Pour les codes d'erreur qu'on compte ne pas retourner tstring strPath; - hr = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" - if (FAILED(hr)) + hr2 = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" + if (FAILED(hr2)) return S_OK; // Invalide : S_OK pour continuer chercher // Tenter d'ajouter le filtre au graphe - hr = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); - if (FAILED(hr)) + myprintf(TEXT("%*sEssai %s\n"), bFirst ? 4 : 6, TEXT(""), cMnkb.strName.c_str()); + hr2 = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); + myprintf(TEXT("%*s-- rsultat essai, hr=0x%x\n"), bFirst ? 4 : 6, TEXT(""), hr2); + if (FAILED(hr2)) return S_OK; // Invalide : S_OK pour continuer chercher DeviceType eDevType = dt_Capture; // dt_Capture par dfaut if (bFirst) { // Premier filtre rcepteur trouv : rechercher s'il n'y en a pas un second - hr = CSearchReceiver(pTestGraph, false, vResult).Do(); + hr2 = CSearchReceiver(pTestGraph, false, vResult).Do(); + myprintf(TEXT(" -- rsultat recherche second rcepteur, hr=0x%x\n"), hr2); // Si un filtre de capture a t trouv en 3me position, alors celui-ci est un filtre // dmodulateur @@ -304,10 +310,11 @@ // Ajout du filtre la position qui lui a t assigne vResult.asDev[eDevType].Set(cMnkb.strName.c_str(), strPath.c_str()); + myprintf(TEXT("%*sDevice path=\"%s\"\n"), bFirst ? 4 : 6, TEXT(""), vResult.asDev[eDevType].strPath.c_str()); // Retirer le filtre - hr = pTestGraph->PopFilter(); - myprintf(CMyP ERRX(TEXT("chec dpilage du filtre rcepteur pendant la recherche, hr=0x%08x")), FAILED(hr), hr); + hr2 = pTestGraph->PopFilter(); + myprintf(TEXT("%*sRetrait %s, hr=0x%x\n"), bFirst ? 4 : 6, TEXT(""), cMnkb.strName.c_str(), hr2); // Retour avec S_FALSE pour indiquer qu'on arrte de chercher return S_FALSE; @@ -332,8 +339,12 @@ vResults(vRslts), pTestGraph(new_TunerGraph(bLegacy)) { - if (pTestGraph.get()) + myprintf(TEXT("Dbut recherche tuners, creation du graphe\n")); + if (pTestGraph.get()) { hr = pTestGraph->Build(); + + myprintf(CMyP ERRX(TEXT("chec construction du graphe, code 0x%08x")), FAILED(hr), hr); + } } @@ -350,45 +361,49 @@ if (FAILED(hr)) return hr; // Erreur la construction - HRESULT hr; // Pour les codes d'erreur qu'on compte ne pas retourner + HRESULT hr2; // Pour les codes d'erreur qu'on compte ne pas retourner #if USE_TUNING_SPACE // Envoi d'un "tune request" (sauf si graphe alternatif, dans lequel // cette fonctionnalit n'est pas exploitable ce stade) if (!pTestGraph->isLegacyGraph()) { - hr = pTestGraph->change_frequence(-1, -1); - if (FAILED(hr)) - return hr; + hr2 = pTestGraph->change_frequence(-1, -1); + if (FAILED(hr2)) { + myprintf(ERRX(TEXT("Erreur : slection frquence impossible, hr=0x%x")), hr2); + // return hr2; + } } #endif tstring strPath; - hr = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" - if (FAILED(hr)) + hr2 = cMnkb.GetDevicePath(strPath); // Obtenir le "device path" + if (FAILED(hr2)) return S_OK; // Invalide : S_OK pour continuer chercher // Tenter d'ajouter le filtre au graphe - hr = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); - if (FAILED(hr)) + myprintf(TEXT(" Essai %s\n"), cMnkb.strName.c_str()); + hr2 = pTestGraph->PushFilter(cMnkb.pFilter, cMnkb.strName.c_str()); + myprintf(TEXT(" -- rsultat essai, hr=0x%x\n"), hr2); + if (FAILED(hr2)) return S_OK; // chec : on retourne nanmoins avec S_OK (pour continuer chercher) // Construction du rsultat DeviceInfo sInf; sInf.asDev[dt_Tuner].Set(cMnkb.strName.c_str(), strPath.c_str()); - + myprintf(TEXT(" Device path=\"%s\"\n"), sInf.asDev[dt_Tuner].strPath.c_str()); // Chercher les filtres matriels supplmentaires qui pourraient tre requis - hr = CSearchReceiver(pTestGraph.get(), dt_Demod, sInf).Do(); + hr2 = CSearchReceiver(pTestGraph.get(), dt_Demod, sInf).Do(); + myprintf(TEXT(" -- rsultat recherche rcepteur, hr=0x%x\n"), hr2); + // Retirer le filtre tuner - HRESULT hr2 = pTestGraph->PopFilter(); + hr2 = pTestGraph->PopFilter(); + myprintf(TEXT(" Retrait %s, hr=0x%x\n"), cMnkb.strName.c_str(), hr2); - myprintf(CMyP ERRX(TEXT("chec dpilage du filtre tuner pendant la recherche, hr=0x%08x")), FAILED(hr2), hr2); - // Ajouter le rsultat l'ensembles des rsultats de la liste - if (SUCCEEDED(hr)) - vResults.push_back(sInf); + vResults.push_back(sInf); return S_OK; } @@ -401,11 +416,13 @@ { HRESULT hr = __super::Do(); - // Recherche et marquage des filtres qui auraient des noms de tuners identiques - vResults.FindDuplicates(); + if (hr == S_OK) { + // Recherche et marquage des filtres qui auraient des noms de tuners identiques + vResults.FindDuplicates(); - // Tri de la liste - sort(vResults.begin(), vResults.end()); + // Tri de la liste + sort(vResults.begin(), vResults.end()); + } return hr; } Modifié: trunk/search.h =================================================================== --- trunk/search.h 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/search.h 2009-12-26 02:13:45 UTC (rev 222) @@ -447,6 +447,10 @@ * \return Code d'erreur DirectShow **/ HRESULT Do(); + + virtual ~CSearchTuner() { + myprintf(TEXT("Fin recherche tuners, destruction du graphe\n")); + /* Note : c'est le destructeur de auto_ptr qui dtruit le graphe */ } }; #endif // #if ADVANCED_TUNER_SEARCH Modifié: trunk/tools/ConditionalHeaderGenerator/ConditionalHeaderGenerator_2005.vcproj =================================================================== --- trunk/tools/ConditionalHeaderGenerator/ConditionalHeaderGenerator_2005.vcproj 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/tools/ConditionalHeaderGenerator/ConditionalHeaderGenerator_2005.vcproj 2009-12-26 02:13:45 UTC (rev 222) @@ -43,7 +43,7 @@ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" MinimalRebuild="true" BasicRuntimeChecks="3" - RuntimeLibrary="3" + RuntimeLibrary="1" UsePrecompiledHeader="0" WarningLevel="3" DebugInformationFormat="4" @@ -116,7 +116,7 @@ sV2.nMinor || nMinor==sV2.nMinor && - nRev>sV2.nRev); + nRev > sV2.nRev || + nRev == sV2.nRev && + atoi(szSvn) > atoi(sV2.szSvn)); } bool operator < (const AppVersion & sV2) const { @@ -767,9 +769,9 @@ AddProgress(); GetInternetFile(TEXT(UPDATE_URL), vBytVersion, eUpda_Check); // Objet traitant de la connexion Internet -#ifdef _DEBUG +#ifdef _DIAGNOSTIC if (!vBytVersion.empty()) { - // Enregistrement du fichier XML reu, en compilation _DEBUG seulement + // Enregistrement du fichier XML reu, en compilation _DIAGNOSTIC seulement TempPathName sUpdateFileName("pouchin_update.xml"); SauveFichier(vBytVersion, sUpdateFileName); Modifié: trunk/version =================================================================== --- trunk/version 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/version 2009-12-26 02:13:45 UTC (rev 222) @@ -1 +1 @@ -0,6,0 +0,6,1 Modifié: trunk/version.rc2 =================================================================== --- trunk/version.rc2 2009-12-26 01:47:30 UTC (rev 221) +++ trunk/version.rc2 2009-12-26 02:13:45 UTC (rev 222) @@ -22,12 +22,12 @@ BEGIN VALUE "Comments", "http://pouchintv.baysse.fr/, http://www.etud.insa-toulouse.fr/~mvelten/pouchintvmod/, http://pouchinteve.free.fr/" VALUE "FileDescription", "Pouchin TV Mod" - VALUE "FileVersion", PTVM_VERSION_STR PTVM_VERSION_SUFFIX + VALUE "FileVersion", PTVM_VERSION_STR VALUE "InternalName", "Pouchin TV Mod" VALUE "LegalCopyright", "Copyright (C) 2006, 2007, 2008, 2009" VALUE "OriginalFilename", "PouchinTVMod.exe" VALUE "ProductName", "Pouchin TV Mod" - VALUE "ProductVersion", PTVM_VERSION_STR PTVM_VERSION_SUFFIX + VALUE "ProductVersion", PTVM_VERSION_STR END END BLOCK "VarFileInfo" From pouchintv-dev at baysse.fr Sat Dec 26 23:53:05 2009 From: pouchintv-dev at baysse.fr (=?iso-8859-1?q?Liste_utilis=E9e_par_les_d=E9veloppeurs?=) Date: Sat, 26 Dec 2009 22:53:05 -0000 Subject: [Pouchintv-dev] [PouchinTVMod] gingko | r223 - tags/pouchintv_mod-0.6.0 trunk Message-ID: <20091226225257.11FAA5F737@mail.baysse.fr> Author: gingko Date: 2009-12-26 23:52:56 +0100 (sam 26 déc 2009) New Revision: 223 Modified: tags/pouchintv_mod-0.6.0/changelog.html tags/pouchintv_mod-0.6.0/main.cpp tags/pouchintv_mod-0.6.0/recprog.cpp tags/pouchintv_mod-0.6.0/recprog.h tags/pouchintv_mod-0.6.0/resource.h tags/pouchintv_mod-0.6.0/version.rc2 trunk/changelog.html trunk/recprog.cpp trunk/recprog.h Log: Version 0.6.0 : Préparation (en principe) à la livraison de la version dite “stable”. recprog.cpp : * Correction d'un bug : un enregistrement programmé qui demande l'arrêt de l'application ou l'extinction de l'ordinateur pouvait interrompre un autre enregistrement en cours (contrairement à ce qui est affiché dans les boîtes de dialogue). recprog.h, recprog.cpp : * Commentaires ajoutés ou modifiés. main.cpp, version.rc2, resource.h : * Retrait du suffixe “RC”. Report dans “trunk”. Modifié: tags/pouchintv_mod-0.6.0/changelog.html =================================================================== --- tags/pouchintv_mod-0.6.0/changelog.html 2009-12-26 02:13:45 UTC (rev 222) +++ tags/pouchintv_mod-0.6.0/changelog.html 2009-12-26 22:52:56 UTC (rev 223) @@ -23,7 +23,7 @@
                  -
                • Retour à l'accueil
                • +
                • Retour à l'accueil
                • Changements réalisés pour la version 0.6
                • Changements réalisés pour la version 0.5
                • Changements réalisés pour la version 0.4
                • @@ -57,8 +57,16 @@

                  Changements réalisés pour la version 0.6

                  -
                  0.6.0.221 RC2 (publiée dans le forum le 26 décembre 2009) :
                  +
                  0.6.0.223 (publiée le 27 décembre 2009) :
                    +
                  • Correction d'un bug : un enregistrement programmé qui demande l'arrêt de l'application + ou l'extinction de l'ordinateur pouvait interrompre un autre enregistrement en cours + (contrairement à ce qui est affiché dans les boîtes de dialogue).
                  • +
                  +
                  + +
                  SVN rév. 221 :
                  +
                  • Certaines colorisations de l'EPG sont rendues légèrement plus foncées.
                  • Correction de bugs :
                    • Certains tuners n'étaient plus trouvés dans la recherche.
                    • @@ -77,7 +85,7 @@
                    • les émissions supposées être en cours de diffusion (selon leur horaire sont affichées avec le texte en bleu ;
                    • les émissions en cours d'enregistrement sont affichées en texte rouge ;
                    • -
                    • les autres émissions sont affichées en gris.
                    +
                  • les autres émissions sont affichées en gris.
                • Dans cette même fenêtre EPG, toutes les colonnes peuvent être triées (alternativement en ordre ascendant et descendant) en cliquant sur l'en-tête de la colonne concernée.
                Modifié: tags/pouchintv_mod-0.6.0/main.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/main.cpp 2009-12-26 02:13:45 UTC (rev 222) +++ tags/pouchintv_mod-0.6.0/main.cpp 2009-12-26 22:52:56 UTC (rev 223) @@ -58,7 +58,7 @@ * Texte de version de l'application **/ TCHAR szAppVersion[] = - TEXT(PTVM_VERSION_STR) TEXT( PTVM_VERSION_SUFFIX) TEXT(" (") + TEXT(PTVM_VERSION_STR) TEXT(" (") #ifdef _WIN64 TEXT("x64") #else Modifié: tags/pouchintv_mod-0.6.0/recprog.cpp =================================================================== --- tags/pouchintv_mod-0.6.0/recprog.cpp 2009-12-26 02:13:45 UTC (rev 222) +++ tags/pouchintv_mod-0.6.0/recprog.cpp 2009-12-26 22:52:56 UTC (rev 223) @@ -37,21 +37,31 @@ #include #include // pour 'sort' -// Dlai de grce pour l'arrt aprs enregistrement : si, l'arrt d'un enregistrement, un -// autre enregistrement est programm dans un dlai plus court que le dlai spcifi, alors -// les options d'arrt du programme ou d'extinction de l'ordinateur sont ignores : -#define DUREE_GRACE_QUIT 15 // Valeur en minutes +/** + * Dlai de grce pour l'arrt aprs enregistrement : si, l'arrt d'un enregistrement, un + * autre enregistrement est programm dans un dlai plus court que le dlai spcifi, alors + * les options d'arrt du programme ou d'extinction de l'ordinateur sont ignores. + * \todo Rendre ceci configurable par l'utilisateur. + **/ +#define DUREE_GRACE_QUIT 30 // Valeur en minutes -// En cas d'arrt programm de l'application et/ou de l'ordinateur l'issue d'un enregistrement, -// le dlai suivant est appliqu avant l'excution effective de l'arrt, afin de garantir une -// terminaison propre de l'enregistrement : +/** + * En cas d'arrt programm de l'application et/ou de l'ordinateur l'issue d'un enregistrement, + * le dlai suivant est appliqu avant l'excution effective de l'arrt, afin de garantir une + * terminaison propre de l'enregistrement. + **/ #define DUREE_QUIT 2000 // Valeur en millisecondes -// Marge pour le calcul des recouvrements de programmations : -// Deux programmations doivent tre spares par au moins ce temps -// (en millisecondes) pourqu'il soit considr qu'elles ne se superposent pas +/** + * Marge pour le calcul des recouvrements de programmations : + * Deux programmations doivent tre spares par au moins ce temps + * (en millisecondes) pourqu'il soit considr qu'elles ne se superposent pas. + **/ #define DUREE_MARGE_RECOUVREMENT 2500 // Valeur en millisecondes +/** + * Liste des enregistrements programms + **/ std::vector Programmes; static HWND hRecordDlg = NULL; @@ -76,6 +86,10 @@ return -1; } +/** + * Fonction callback de traitement de la saisie du mot de passe requis lors de l'ajout d'une + * tche dans le planificateur de tches + **/ static INT_PTR CALLBACK PaswdDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: @@ -107,6 +121,9 @@ } } +/** + * Saisie du mot de passe requis lors de l'ajout d'une tche dans le planificateur de tches + **/ static bool taskLogon(HWND hDlg, LPCWSTR username) { // Vrifie le login, et demande le mot de passe si besoin est @@ -128,6 +145,10 @@ return identifie; } +/** + * Tableau de chanes affichables correspondant aux diffrents tats possibles + * d'un enregistrement programm + **/ const LPCTSTR Programme::t_states[] = { TEXT("Attente"), @@ -139,7 +160,7 @@ TEXT("Erreur") }; -// Constructeur : +/// Constructeur Programme::Programme() { apres = apr_rien; @@ -148,7 +169,7 @@ } -// Retourne 'true' si intersection temporelle avec la programmation 'p2' +/// Retourne \p true si intersection temporelle avec la programmation \p p2 bool Programme::overlap(const Programme & p2) const { // avec 1000 millisecondes de marge @@ -224,6 +245,11 @@ return res; } +/** + * Affichage du message d'avertissement en cas de conflit dans une programmation + * \param[in] pszMessage Texte du message afficher + * \return \p true ou \p false selon que l'utilisateur souhaite nanmoins poursuive ou pas + **/ bool Programme::warn_prog(LPCTSTR pszMessage) { tstring strMsg(pszMessage); @@ -645,7 +671,13 @@ } } -// Obtenir la date et l'heure d'une paire de contrles de type "SysDateTimePick32" +/** + * Obtenir la date et l'heure d'une paire de contrles de type \p SysDateTimePick32 + * \param[in] hDlg Handle du dialogue contenant ces contrles + * \param[in] dateID Identifiant du contrle de date + * \param[in] timeID Identifiant du contrle d'heure + * \param[out] result Date et heure retournes + **/ static void GetCtlTimeDate(HWND hDlg, int dateID, int timeID, SYSTEMTIME & result) { SYSTEMTIME time_buffer; @@ -659,17 +691,30 @@ result.wMilliseconds = 0; } +/** + * Dfinir la date et l'heure dans une paire de contrles de type \p SysDateTimePick32 + * \param[in] hDlg Handle du dialogue contenant ces contrles + * \param[in] dateID Identifiant du contrle de date + * \param[in] timeID Identifiant du contrle d'heure + * \param[out] value Date et heure charger + **/ static void SetCtlTimeDate(HWND hDlg, int dateID, int timeID, const SYSTEMTIME & value) { SendDlgItemMessage(hDlg, dateID, DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM)&value); SendDlgItemMessage(hDlg, timeID, DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM)&value); } -// Obtenir la date et l'heure d'une paire de contrles de type "SysDateTimePick32" -// avec gestion du report des retenues des secondes vers les minutes, des minutes -// vers les secondes et des secondes vers les heures. -// Le bon fonctionnement de cette procdure implique que 'result' contienne la -// valeur prcdente du contrle en entre : +/** + * Obtenir la date et l'heure d'une paire de contrles de type "SysDateTimePick32" + * avec gestion du report des retenues des secondes vers les minutes, des minutes + * vers les secondes et des secondes vers les heures. + * Le bon fonctionnement de cette procdure implique que 'result' contienne la + * valeur prcdente du contrle en entre. + * \param[in] hDlg Handle du dialogue contenant ces contrles + * \param[in] dateID Identifiant du contrle de date + * \param[in] timeID Identifiant du contrle d'heure + * \param[out] result Date et heure retournes + **/ static void GetCtlTimeDateChg(HWND hDlg, int dateID, int timeID, SYSTEMTIME & result) { SYSTEMTIME tempres; @@ -733,6 +778,10 @@ result = tempres; } +/** + * Chargement de la liste des enregistrements programms. + * \param[in] hListItem Handle du contrle de liste + **/ static void remplit_liste_programmes(HWND hListItem) { TCHAR buffer[64]; @@ -1921,10 +1970,10 @@ } } - if (temps_prochain_enregistrement(localtime) < DUREE_GRACE_QUIT*60*1000) { - // si le temps restant avant le prochain enregistrement est infrieur - // celle dfinie par la constante DUREE_GRACE_QUIT, alors on annule toute - // action d'arrt du programme et/ou de l'ordinateur dfinie l'issue + if (enregistrements_actuels.recording() || temps_prochain_enregistrement(localtime) < DUREE_GRACE_QUIT*60*1000) { + // si d'autres enregistrements sont en cours, ou bien si le temps restant avant le + // prochain enregistrement est infrieur celui dfini par la constante DUREE_GRACE_QUIT, + // alors on annule toute action d'arrt du programme et/ou de l'ordinateur dfinie l'issue // du ou des arrts effectus after = min(after, apr_rien); } Modifié: tags/pouchintv_mod-0.6.0/recprog.h =================================================================== --- tags/pouchintv_mod-0.6.0/recprog.h 2009-12-26 02:13:45 UTC (rev 222) +++ tags/pouchintv_mod-0.6.0/recprog.h 2009-12-26 22:52:56 UTC (rev 223) @@ -108,6 +108,11 @@ **/ bool verifie(const Programme * prog_modif=NULL) const; + /** + * Affichage du message d'avertissement en cas de conflit dans une programmation + * \param[in] pszMessage Texte du message afficher + * \return \p true ou \p false selon que l'utilisateur souhaite nanmoins poursuivre ou pas + **/ static bool warn_prog(LPCTSTR pszMessage); @@ -214,6 +219,9 @@ _tcscpy_s(pszBuf, nCount, t_states[etat]); } }; +/** + * Liste des enregistrements programms + **/ extern std::vector Programmes; /** Modifié: tags/pouchintv_mod-0.6.0/resource.h =================================================================== --- tags/pouchintv_mod-0.6.0/resource.h 2009-12-26 02:13:45 UTC (rev 222) +++ tags/pouchintv_mod-0.6.0/resource.h 2009-12-26 22:52:56 UTC (rev 223) @@ -256,8 +256,6 @@ #define IDM_BRANCHE 40094 // debug #define IDM_DEBRANCHE 40095 // debug -#define PTVM_VERSION_SUFFIX " RC2" // temporaire - // Next default values for new objects // #ifdef APSTUDIO_INVOKED Modifié: tags/pouchintv_mod-0.6.0/version.rc2 =================================================================== --- tags/pouchintv_mod-0.6.0/version.rc2 2009-12-26 02:13:45 UTC (rev 222) +++ tags/pouchintv_mod-0.6.0/version.rc2 2009-12-26 22:52:56 UTC (rev 223) @@ -22,12 +22,12 @@ BEGIN VALUE "Comments", "http://pouchintv.baysse.fr/, http://www.etud.insa-toulouse.fr/~mvelten/pouchintvmod/, http://pouchinteve.free.fr/" VALUE "FileDescription", "Pouchin TV Mod" - VALUE "FileVersion", PTVM_VERSION_STR PTVM_VERSION_SUFFIX + VALUE "FileVersion", PTVM_VERSION_STR VALUE "InternalName", "Pouchin TV Mod" VALUE "LegalCopyright", "Copyright (C) 2006, 2007, 2008, 2009" VALUE "OriginalFilename", "PouchinTVMod.exe" VALUE "ProductName", "Pouchin TV Mod" - VALUE "ProductVersion", PTVM_VERSION_STR PTVM_VERSION_SUFFIX + VALUE "ProductVersion", PTVM_VERSION_STR END END BLOCK "VarFileInfo" Modifié: trunk/changelog.html =================================================================== --- trunk/changelog.html 2009-12-26 02:13:45 UTC (rev 222) +++ trunk/changelog.html 2009-12-26 22:52:56 UTC (rev 223) @@ -23,7 +23,7 @@
                  -
                • Retour à l'accueil
                • +
                • Retour à l'accueil
                • Changements réalisés pour la version 0.6
                • Changements réalisés pour la version 0.5
                • Changements réalisés pour la version 0.4
                • @@ -57,8 +57,16 @@

                  Changements réalisés pour la version 0.6

                  -
                  0.6.0.221 RC2 (publiée dans le forum le 26 décembre 2009) :
                  +
                  0.6.0.223 (publiée le 27 décembre 2009) :
                    +
                  • Correction d'un bug : un enregistrement programmé qui demande l'arrêt de l'application + ou l'extinction de l'ordinateur pouvait interrompre un autre enregistrement en cours + (contrairement à ce qui est affiché dans les boîtes de dialogue).
                  • +
                  +
                  + +
                  SVN rév. 221 :
                  +
                  • Certaines colorisations de l'EPG sont rendues légèrement plus foncées.
                  • Correction de bugs :
                    • Certains tuners n'étaient plus trouvés dans la recherche.
                    • @@ -77,7 +85,7 @@
                    • les émissions supposées être en cours de diffusion (selon leur horaire sont affichées avec le texte en bleu ;
                    • les émissions en cours d'enregistrement sont affichées en texte rouge ;
                    • -
                    • les autres émissions sont affichées en gris.
                    +
                  • les autres émissions sont affichées en gris.
                • Dans cette même fenêtre EPG, toutes les colonnes peuvent être triées (alternativement en ordre ascendant et descendant) en cliquant sur l'en-tête de la colonne concernée.
                Modifié: trunk/recprog.cpp =================================================================== --- trunk/recprog.cpp 2009-12-26 02:13:45 UTC (rev 222) +++ trunk/recprog.cpp 2009-12-26 22:52:56 UTC (rev 223) @@ -37,21 +37,31 @@ #include #include // pour 'sort' -// Dlai de grce pour l'arrt aprs enregistrement : si, l'arrt d'un enregistrement, un -// autre enregistrement est programm dans un dlai plus court que le dlai spcifi, alors -// les options d'arrt du programme ou d'extinction de l'ordinateur sont ignores : -#define DUREE_GRACE_QUIT 15 // Valeur en minutes +/** + * Dlai de grce pour l'arrt aprs enregistrement : si, l'arrt d'un enregistrement, un + * autre enregistrement est programm dans un dlai plus court que le dlai spcifi, alors + * les options d'arrt du programme ou d'extinction de l'ordinateur sont ignores. + * \todo Rendre ceci configurable par l'utilisateur. + **/ +#define DUREE_GRACE_QUIT 30 // Valeur en minutes -// En cas d'arrt programm de l'application et/ou de l'ordinateur l'issue d'un enregistrement, -// le dlai suivant est appliqu avant l'excution effective de l'arrt, afin de garantir une -// terminaison propre de l'enregistrement : +/** + * En cas d'arrt programm de l'application et/ou de l'ordinateur l'issue d'un enregistrement, + * le dlai suivant est appliqu avant l'excution effective de l'arrt, afin de garantir une + * terminaison propre de l'enregistrement. + **/ #define DUREE_QUIT 2000 // Valeur en millisecondes -// Marge pour le calcul des recouvrements de programmations : -// Deux programmations doivent tre spares par au moins ce temps -// (en millisecondes) pourqu'il soit considr qu'elles ne se superposent pas +/** + * Marge pour le calcul des recouvrements de programmations : + * Deux programmations doivent tre spares par au moins ce temps + * (en millisecondes) pourqu'il soit considr qu'elles ne se superposent pas. + **/ #define DUREE_MARGE_RECOUVREMENT 2500 // Valeur en millisecondes +/** + * Liste des enregistrements programms + **/ std::vector Programmes; static HWND hRecordDlg = NULL; @@ -76,6 +86,10 @@ return -1; } +/** + * Fonction callback de traitement de la saisie du mot de passe requis lors de l'ajout d'une + * tche dans le planificateur de tches + **/ static INT_PTR CALLBACK PaswdDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: @@ -107,6 +121,9 @@ } } +/** + * Saisie du mot de passe requis lors de l'ajout d'une tche dans le planificateur de tches + **/ static bool taskLogon(HWND hDlg, LPCWSTR username) { // Vrifie le login, et demande le mot de passe si besoin est @@ -128,6 +145,10 @@ return identifie; } +/** + * Tableau de chanes affichables correspondant aux diffrents tats possibles + * d'un enregistrement programm + **/ const LPCTSTR Programme::t_states[] = { TEXT("Attente"), @@ -139,7 +160,7 @@ TEXT("Erreur") }; -// Constructeur : +/// Constructeur Programme::Programme() { apres = apr_rien; @@ -148,7 +169,7 @@ } -// Retourne 'true' si intersection temporelle avec la programmation 'p2' +/// Retourne \p true si intersection temporelle avec la programmation \p p2 bool Programme::overlap(const Programme & p2) const { // avec 1000 millisecondes de marge @@ -224,6 +245,11 @@ return res; } +/** + * Affichage du message d'avertissement en cas de conflit dans une programmation + * \param[in] pszMessage Texte du message afficher + * \return \p true ou \p false selon que l'utilisateur souhaite nanmoins poursuive ou pas + **/ bool Programme::warn_prog(LPCTSTR pszMessage) { tstring strMsg(pszMessage); @@ -645,7 +671,13 @@ } } -// Obtenir la date et l'heure d'une paire de contrles de type "SysDateTimePick32" +/** + * Obtenir la date et l'heure d'une paire de contrles de type \p SysDateTimePick32 + * \param[in] hDlg Handle du dialogue contenant ces contrles + * \param[in] dateID Identifiant du contrle de date + * \param[in] timeID Identifiant du contrle d'heure + * \param[out] result Date et heure retournes + **/ static void GetCtlTimeDate(HWND hDlg, int dateID, int timeID, SYSTEMTIME & result) { SYSTEMTIME time_buffer; @@ -659,17 +691,30 @@ result.wMilliseconds = 0; } +/** + * Dfinir la date et l'heure dans une paire de contrles de type \p SysDateTimePick32 + * \param[in] hDlg Handle du dialogue contenant ces contrles + * \param[in] dateID Identifiant du contrle de date + * \param[in] timeID Identifiant du contrle d'heure + * \param[out] value Date et heure charger + **/ static void SetCtlTimeDate(HWND hDlg, int dateID, int timeID, const SYSTEMTIME & value) { SendDlgItemMessage(hDlg, dateID, DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM)&value); SendDlgItemMessage(hDlg, timeID, DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM)&value); } -// Obtenir la date et l'heure d'une paire de contrles de type "SysDateTimePick32" -// avec gestion du report des retenues des secondes vers les minutes, des minutes -// vers les secondes et des secondes vers les heures. -// Le bon fonctionnement de cette procdure implique que 'result' contienne la -// valeur prcdente du contrle en entre : +/** + * Obtenir la date et l'heure d'une paire de contrles de type "SysDateTimePick32" + * avec gestion du report des retenues des secondes vers les minutes, des minutes + * vers les secondes et des secondes vers les heures. + * Le bon fonctionnement de cette procdure implique que 'result' contienne la + * valeur prcdente du contrle en entre. + * \param[in] hDlg Handle du dialogue contenant ces contrles + * \param[in] dateID Identifiant du contrle de date + * \param[in] timeID Identifiant du contrle d'heure + * \param[out] result Date et heure retournes + **/ static void GetCtlTimeDateChg(HWND hDlg, int dateID, int timeID, SYSTEMTIME & result) { SYSTEMTIME tempres; @@ -733,6 +778,10 @@ result = tempres; } +/** + * Chargement de la liste des enregistrements programms. + * \param[in] hListItem Handle du contrle de liste + **/ static void remplit_liste_programmes(HWND hListItem) { TCHAR buffer[64]; @@ -1921,10 +1970,10 @@ } } - if (temps_prochain_enregistrement(localtime) < DUREE_GRACE_QUIT*60*1000) { - // si le temps restant avant le prochain enregistrement est infrieur - // celle dfinie par la constante DUREE_GRACE_QUIT, alors on annule toute - // action d'arrt du programme et/ou de l'ordinateur dfinie l'issue + if (enregistrements_actuels.recording() || temps_prochain_enregistrement(localtime) < DUREE_GRACE_QUIT*60*1000) { + // si d'autres enregistrements sont en cours, ou bien si le temps restant avant le + // prochain enregistrement est infrieur celui dfini par la constante DUREE_GRACE_QUIT, + // alors on annule toute action d'arrt du programme et/ou de l'ordinateur dfinie l'issue // du ou des arrts effectus after = min(after, apr_rien); } Modifié: trunk/recprog.h =================================================================== --- trunk/recprog.h 2009-12-26 02:13:45 UTC (rev 222) +++ trunk/recprog.h 2009-12-26 22:52:56 UTC (rev 223) @@ -108,6 +108,11 @@ **/ bool verifie(const Programme * prog_modif=NULL) const; + /** + * Affichage du message d'avertissement en cas de conflit dans une programmation + * \param[in] pszMessage Texte du message afficher + * \return \p true ou \p false selon que l'utilisateur souhaite nanmoins poursuivre ou pas + **/ static bool warn_prog(LPCTSTR pszMessage); @@ -214,6 +219,9 @@ _tcscpy_s(pszBuf, nCount, t_states[etat]); } }; +/** + * Liste des enregistrements programms + **/ extern std::vector Programmes; /**