2025-04-27 07:49:33 -04:00

281 lines
7.0 KiB
C++

/*==========================================================================
*
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
*
* File: woplays.cpp
* Content:
* This module contains the implementation of the CWaveOutPlaybackSubSystem
* class.
*
* History:
* Date By Reason
* ==== == ======
* 07/16/99 rodtoll Created
* 09/20/99 rodtoll Updated to check for out of memory conditions
*
***************************************************************************/
#include "stdafx.h"
#include "woplays.h"
#include "woplayd.h"
#include "dndbg.h"
#include "wiutils.h"
#include "OSInd.h"
#define MODULE_ID WAVEOUTPLAYBACKSUBSYSTEM
// CWaveOutPlaybackSubSystem Constructor
//
// This is the constructor for the CWaveOutPlaybackSubSystem class. It is
// responisible for determining if the waveOUT subsystem is valid and if
// it is building a list of devices which are available through it. It
// is also responsible for mapping between ARDID <--> waveOUT device IDs.
// (They are equivalent).
//
// Once this constructor has completed, you can check to see if the waveOUT
// subsystem is valid by checking the valid flag. The waveOUT subsystem
// is considered invalid if it is not available or has 0 devices available.
//
// Parameters:
// N/A
//
// Returns:
// N/A
//
CWaveOutPlaybackSubSystem::CWaveOutPlaybackSubSystem(): CAudioPlaybackSubSystem()
{
unsigned int numDevices;
WAVEOUTCAPS waveCaps;
ARDeviceInfo *info;
TCHAR tmpID[10];
// Retrieve the # of waveOut devices
numDevices = waveOutGetNumDevs();
// Enumerate the waveOUT devices
for( unsigned int deviceID = 0; deviceID < numDevices; deviceID++ )
{
// Check each deviceID, if it's valid, create an entry in the map
// for it
try
{
WAVEINCHECK( waveOutGetDevCaps( deviceID, &waveCaps, sizeof( WAVEOUTCAPS ) ) );
info = new ARDeviceInfo;
if( info == NULL )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Unable to allocate device struct" );
continue;
}
info->m_deviceName = waveCaps.szPname ;
info->m_emulated = false;
_ltot( deviceID, tmpID, 10 );
DPFX(DPFPREP, DVF_INFOLEVEL, "WOPS: Device %u valid", tmpID );
m_deviceMap[(ARDID) deviceID] = info;
}
catch( WaveInException &wie )
{
DPFX(DPFPREP, DVF_INFOLEVEL, wie.what() );
DPFX(DPFPREP, DVF_INFOLEVEL, "WOPS: Device %u INVALID", tmpID );
}
}
// If there are no available devices, mark the subsystem as
// invalid.
if( GetNumDevices() == 0 )
{
m_valid = false;
return;
}
m_valid = true;
}
// CleanupDeviceMap
//
// This function cleans up the memory allocated by the
// the device map within the object. This should not
// be called directly by the user only by the class
// itself.
//
// Parameters:
// N/A
//
// Returns:
// N/A
//
void CWaveOutPlaybackSubSystem::CleanupDeviceMap()
{
DeviceMapIterator deviceIterator;
deviceIterator = m_deviceMap.begin();
while( deviceIterator != m_deviceMap.end() )
{
delete (*deviceIterator).second;
deviceIterator++;
}
}
// CWaveOutPlaybackSubSystem Destructor
//
// This is the destructor for the CWaveOutPlaybackSubSystem class.
// It is responsible for cleaning up the maps and memory allocated
// by the object.
//
// Parameters:
// N/A
//
// Returns:
// N/A
//
CWaveOutPlaybackSubSystem::~CWaveOutPlaybackSubSystem()
{
CleanupDeviceMap();
}
// IsValidDevice
//
// This function checks to see if the specified ARDID is valid
// for this subsystem.
//
// Parameters:
// ARDID deviceID -
// The ARDID for the device we wish to check.
//
// Returns:
// bool -
// Returns true if the specified ARDID is valid for
// this subsystem, false otherwise.
//
bool CWaveOutPlaybackSubSystem::IsValidDevice( ARDID deviceID )
{
DeviceMapIterator deviceIterator;
deviceIterator = m_deviceMap.begin();
if( deviceIterator != m_deviceMap.end() )
{
return true;
}
else
{
return false;
}
}
// CreateDevice
//
// This function creates a new CWaveOutPlaybackDevice object attached
// to the specified ARDID (if valid) and returns a CAudioPlaybackDevice
// pointer to the new object.
//
// The newly created object is owned by the caller and must be freed
// by them.
//
// Parameters:
// ARDID deviceID -
// The ARDID of the device which you wish to create an object
// to manage.
//
// Returns:
// CAudioPlaybackDevice * -
// A CAudioPLaybackDevice pointer to a newly created CAudioPlaybackDevice
// object or NULL if the specified deviceID is invalid.
//
CAudioPlaybackDevice *CWaveOutPlaybackSubSystem::CreateDevice( ARDID deviceID )
{
// Check to see if the device is valid, if it is, create
// the object, otherwise return NULL.
if( IsValidDevice( deviceID ) )
{
DeviceMapIterator deviceIterator;
deviceIterator = m_deviceMap.find( deviceID );
BFC_ASSERT( deviceIterator != m_deviceMap.end() );
return new CWaveOutPlaybackDevice( deviceID, deviceID, this );
}
else
{
return NULL;
}
}
// GetDeviceInfo
//
// This function retrieves information about a specified ARDID in this
// subsystem. (If available).
//
// Parameters:
// ARDID deviceID -
// The ARDID for the device we wish to retrieve information about.
// ARDeviceInfo &device -
// Reference to a structure where information about the requested
// devices will be placed. This structure will not be touched if
// the ARDID is not valid for this subsystem.
//
// Returns:
// bool -
// Returns true if the specified ARDID is valid for this subsystem
// and device has been filled with information about it.
// false otherwise.
//
bool CWaveOutPlaybackSubSystem::GetDeviceInfo( ARDID deviceID, ARDeviceInfo &device )
{
DeviceMapIterator deviceIterator;
deviceIterator = m_deviceMap.find(deviceID);
if( deviceIterator != m_deviceMap.end() )
{
device = *((*deviceIterator).second);
return true;
}
else
{
return false;
}
}
// GetNumDevices
//
// This function returns the number of valid devices detected in the
// waveOUT subsystem.
//
// Parameters:
// N/A
//
// Returns:
// unsigned int -
// The number of devices available through this subsystem
//
unsigned int CWaveOutPlaybackSubSystem::GetNumDevices()
{
return m_deviceMap.size();
}
// GetSubSystemName
//
// This function returns a pointer to a string identifying the
// type of playback subsystem being managed by this object.
//
// Parameters:
// N/A
//
// Returns:
// const TCHAR * -
// Returns pointer to a string containing "WAVEOUT".
const TCHAR *CWaveOutPlaybackSubSystem::GetSubSystemName()
{
return _T("WaveOut");
}