home *** CD-ROM | disk | FTP | other *** search
/ Game Audio Programming / GameAudioProgramming.iso / Game_Audio / audio_sdk / src / AudioLib / PropertySet.cpp < prev    next >
C/C++ Source or Header  |  2002-07-15  |  7KB  |  232 lines

  1. /***********************************************************\
  2. Copyright (C) James Boer, 2002. 
  3. All rights reserved worldwide.
  4.  
  5. This software is provided "as is" without express or implied
  6. warranties. You may freely copy and compile this source into
  7. applications you distribute provided that the copyright text
  8. below is included in the resulting source code, for example:
  9. "Portions Copyright (C) James Boer, 2002"
  10. \***********************************************************/
  11.  
  12. #include "Audio.h"
  13. #include "AudioCommon.h"
  14. #include "AudioMgr.h"
  15. #include "PropertySet.h"
  16.  
  17. using namespace Audio;
  18.  
  19. //------------------------------------------------------------------------//
  20. PropertySet::PropertySet()
  21. {
  22.     Clear();
  23. }
  24.  
  25. //------------------------------------------------------------------------//
  26. PropertySet::~PropertySet()
  27. {
  28.     Term();
  29. }
  30.  
  31.  
  32. //------------------------------------------------------------------------//
  33. void PropertySet::Clear()
  34. {
  35.     m_pPropertySet = 0;
  36.     m_PropertyList.clear();
  37. }
  38.  
  39.  
  40. //------------------------------------------------------------------------//
  41. void PropertySet::Term()
  42. {
  43.     PropertyList::iterator itr;
  44.     for(itr = m_PropertyList.begin(); itr != m_PropertyList.end(); ++itr)
  45.     {
  46.         SAFE_DELETE_ARRAY((*itr).m_pInstanceData);
  47.         SAFE_DELETE_ARRAY((*itr).m_pPropData);
  48.     }
  49.     Clear();
  50. }
  51.  
  52.  
  53. //------------------------------------------------------------------------//
  54. bool PropertySet::OnLoad(IUnknown* pUnknown)
  55. {
  56.     if(!pUnknown)
  57.         return false;
  58.     IKsPropertySet* pPropertySet;
  59.     HRESULT hr = pUnknown->QueryInterface(IID_IKsPropertySet, (void**)&pPropertySet);
  60.     if(FAILED(hr))
  61.         return false;
  62.     m_pPropertySet = pPropertySet;
  63.     // Iterate through all the properties and set them on the buffer
  64.     PropertyList::iterator itr;
  65.     for(itr = m_PropertyList.begin(); itr != m_PropertyList.end(); ++itr)
  66.         m_pPropertySet->Set((*itr).m_guid, (*itr).m_nID, (*itr).m_pInstanceData, 
  67.         (*itr).m_nInstanceLength, (*itr).m_pPropData, (*itr).m_nPropLength);
  68.     return true;
  69. }
  70.  
  71. //------------------------------------------------------------------------//
  72. bool PropertySet::OnUnload()
  73. {
  74.  
  75.     if(!m_pPropertySet)
  76.         return true;
  77.  
  78.     // Retrieve any buffer property sets
  79.     PropertyList::iterator itr;
  80.     for(itr = m_PropertyList.begin(); itr != m_PropertyList.end(); ++itr)
  81.     {
  82.         uint32 nBytesReturned;
  83.         m_pPropertySet->Get(
  84.             (*itr).m_guid, 
  85.             (*itr).m_nID, 
  86.             (*itr).m_pInstanceData, 
  87.             (*itr).m_nInstanceLength, 
  88.             (*itr).m_pPropData, 
  89.             (*itr).m_nPropLength, 
  90.             &nBytesReturned);
  91.     }
  92.  
  93.     SAFE_RELEASE(m_pPropertySet);
  94.     return true;
  95. }
  96.  
  97. //------------------------------------------------------------------------//
  98. // Generic property support (for driver-specific extensions)
  99. bool PropertySet::QuerySupport(const GUID& guid, uint32 nID, uint32* pTypeSupport)
  100. {
  101.     FN("PropertySet::QuerySupport()");
  102.     if(!m_pPropertySet)
  103.         return false;
  104.     HRESULT hr = m_pPropertySet->QuerySupport(guid, nID, pTypeSupport);
  105.     if(FAILED(hr))
  106.         return Error::Handle("Error = %s", DXGetErrorString(hr));
  107.     return true;
  108. }
  109.  
  110.  
  111. //------------------------------------------------------------------------//
  112. bool PropertySet::Get(const GUID& guidProperty, uint32 nID, void* pInstanceData,
  113.     uint32 nInstanceLength, void* pPropData, uint32 nPropLength, uint32* pBytesReturned)
  114. {
  115.     FN("PropertySet::Get()");
  116.  
  117.     if(m_pPropertySet)
  118.     {
  119.         HRESULT hr = m_pPropertySet->Get(guidProperty, nID, pInstanceData, nInstanceLength, 
  120.             pPropData, nPropLength, pBytesReturned);
  121.         if(FAILED(hr))
  122.             return Error::Handle("Error = %s", DXGetErrorString(hr));
  123.         return true;
  124.     }
  125.     // If we can't retrieve the information from the buffer, we'll
  126.     // retrieve it from our stored data.
  127.     PropertyList::iterator itr;
  128.     for(itr = m_PropertyList.begin(); itr != m_PropertyList.end(); ++itr)
  129.     {
  130.         // Set the data if we have an exact match on both GUID and ID
  131.         if((guidProperty == (*itr).m_guid) && (nID == (*itr).m_nID))
  132.         {
  133.             if(pInstanceData && (nInstanceLength <= (*itr).m_nInstanceLength))
  134.                 memcpy(pInstanceData, (*itr).m_pInstanceData, (*itr).m_nInstanceLength);
  135.             if(pPropData && (nPropLength <= (*itr).m_nPropLength))
  136.                 memcpy(pPropData, (*itr).m_pPropData, (*itr).m_nPropLength);
  137.             *pBytesReturned = (*itr).m_nPropLength;
  138.             return true;
  139.         }
  140.     }
  141.  
  142.     return false;
  143. }
  144.  
  145.  
  146. //------------------------------------------------------------------------//
  147. bool PropertySet::Set(const GUID& guidProperty, uint32 nID, void* pInstanceData,
  148.     uint32 nInstanceLength, void* pPropData, uint32 nPropLength, bool bStoreProperty)
  149. {
  150.     FN("PropertySet::Set()");
  151.  
  152.     if(m_pPropertySet)
  153.     {    
  154.         HRESULT hr = m_pPropertySet->Set(guidProperty, nID, pInstanceData, 
  155.             nInstanceLength, pPropData, nPropLength);
  156.         if(FAILED(hr))
  157.             // We still need to store the data, so don't return an error
  158.             Error::Handle("Error = %s", DXGetErrorString(hr));
  159.     }
  160.     
  161.     // Don't bother continuing if the user doesn't wish to store the property
  162.     if(!bStoreProperty)
  163.         return true;
  164.  
  165.     bool bFoundProperty = false;
  166.  
  167.     // Iterate through all the properties and set the on the buffer
  168.     PropertyList::iterator itr;
  169.     for(itr = m_PropertyList.begin(); itr != m_PropertyList.end(); ++itr)
  170.     {
  171.         // Set the data if we have a match on the property set GUID and
  172.         // the ID
  173.         if((guidProperty == (*itr).m_guid) && (nID == (*itr).m_nID))
  174.         {
  175.             uint32 nBytesReturned = 0;
  176.             // Update instance data if needed
  177.             if(pInstanceData)
  178.             {
  179.                 // Generally, we will not have to realloc, but just in case...
  180.                 if(nInstanceLength > (*itr).m_nInstanceLength)
  181.                 {
  182.                     delete[] (*itr).m_pInstanceData;
  183.                     (*itr).m_pInstanceData = new uint8[nInstanceLength];
  184.                 }
  185.                 memcpy((*itr).m_pInstanceData, pInstanceData, nInstanceLength);
  186.                 (*itr).m_nInstanceLength = nInstanceLength;
  187.             }
  188.             // Update prop data if needed
  189.             if(pPropData)
  190.             {
  191.                 // Generally, we will not have to realloc, but just in case...
  192.                 if(nPropLength > (*itr).m_nPropLength)
  193.                 {
  194.                     delete[] (*itr).m_pPropData;
  195.                     (*itr).m_pPropData = new uint8[nPropLength];
  196.                 }
  197.                 memcpy((*itr).m_pPropData, pPropData, nPropLength);
  198.                 (*itr).m_nPropLength = nPropLength;
  199.             }
  200.             bFoundProperty = true;
  201.             break;
  202.         }
  203.     }
  204.  
  205.     // If we haven't found an existing property (GUID + ID as key), 
  206.     // allocate storage for the data and create a new entry in the 
  207.     // property list
  208.     if(!bFoundProperty)
  209.     {
  210.         GenericProperty prop;
  211.         prop.m_guid = guidProperty;
  212.         prop.m_nID = nID;
  213.         if(pInstanceData)
  214.         {
  215.             prop.m_pInstanceData = new uint8[nInstanceLength];
  216.             memcpy(prop.m_pInstanceData, pInstanceData, nInstanceLength);
  217.             prop.m_nInstanceLength = nInstanceLength;
  218.         }
  219.         if(pPropData)
  220.         {
  221.             prop.m_pPropData = new uint8[nPropLength];
  222.             memcpy(prop.m_pPropData, pPropData, nPropLength);
  223.             prop.m_nPropLength = nPropLength;
  224.         }
  225.         m_PropertyList.push_back(prop);
  226.     }
  227.  
  228.     return true;
  229. }
  230.  
  231.  
  232.