Example #1
0
/**********************************************************
* COperator::ListenOnAddresses *
*------------------------------*
*   Description:
*       Find all addresses that support audio in and audio
*       out.  Call ListenOnThisAddress to start listening
*   Return:
*       S_OK
*       S_FALSE if there are no addresses to listen on
*       Failed HRESULT ITTAPI::EnumberateAddresses() 
*           or IEnumAddress::Next()
************************************************************/
HRESULT COperator::ListenOnAddresses()
{
    // enumerate the addresses
    IEnumAddress *      pEnumAddress;
    HRESULT hr = m_pTapi->EnumerateAddresses( &pEnumAddress );

    if ( FAILED(hr) )
    {
        return hr;
    }

    ITAddress *         pAddress;
    bool                fAddressExists = false;
    while ( true )
    {
        // get the next address
        hr = pEnumAddress->Next( 1, &pAddress, NULL );
        if (S_OK != hr)
        {
            // Done dealing with all the addresses
            break;
        }

        // Does the address support audio?
        if ( AddressSupportsMediaType(pAddress, TAPIMEDIATYPE_AUDIO) )
        {
            // If it does then we'll listen.
            HRESULT hrListen = ListenOnThisAddress( pAddress );
            
            if ( S_OK == hrListen )
            {
                fAddressExists = true;
            }
        }
        pAddress->Release();

    }
    pEnumAddress->Release();

    if ( !fAddressExists )
    {
        DoMessage( L"Could not find any addresses to listen on" );
    }

    if ( FAILED( hr ) )
    {
        return hr;
    }
    else
    {
        return fAddressExists ? S_OK : S_FALSE;
    }
}   /* COperator::ListenOnAddress */
HRESULT StartListening()
{

    HRESULT hr = S_OK;

    LogMessage("StartListening: started");
    

    //
    // enumerate available addresses
    // 
    
    IEnumAddress *pEnumAddress = NULL;

    hr = g_pTapi->EnumerateAddresses( &pEnumAddress );

    if (FAILED(hr))
    {
        LogError("StartListening: Failed to enumerate addresses");

        return hr;
    }


    //
    // this flag remains false until we succeded starting listening on at 
    // least one address
    //

    BOOL bListenStarted = FALSE;


    //
    // walk through all the addresses and start listening on the ones that
    // support audio
    //
    
    while (TRUE)
    {
        //
        // check the next address
        //

        ITAddress *pAddress = NULL;

        hr = pEnumAddress->Next(1, &pAddress, NULL);

        if (S_OK != hr)
        {

            //
            // no more addresses or error
            //

            break;
        }


        //
        // log the name of the address
        //

        BSTR bstrAddressName;
        hr = pAddress->get_AddressName(&bstrAddressName);

        if (SUCCEEDED(hr))
        {

            LogMessage("StartListening: -> found address [%S]",
                        bstrAddressName);

            SysFreeString(bstrAddressName);
        }
        else
        {
            LogError("StartListening: failed to get address name");
        }


        //
        // if the address supports audio and media streaming terminal, 
        // start listening
        //

        if ( AddressSupportsAudio(pAddress) && AddressSupportsMST(pAddress) )
        {

            //
            // start listening on this address
            // 

            LogMessage("StartListening: Starting listening.");

            hr = ListenOnAddress(pAddress);

            if (SUCCEEDED(hr))
            {

                //
                // we are listening on at least one address
                //

                bListenStarted = TRUE;

                LogMessage("StartListening: "
                           "-> started listening on this address");

            }
            else
            {
                //
                // log an error and continue
                //

                LogError("StartListening: -> failed starting listening on this address, "
                         "hr = 0x%lx", hr);
            }
        }
        else
        {
            LogMessage("StartListening: -> no audio or MST support on this address.");
        }


        pAddress->Release();
        pAddress = NULL;

    }


    pEnumAddress->Release();
    pEnumAddress = NULL;


    //
    // depending on whether we started listening or not, log a message and
    // return the appropriate error code.
    //

    if (bListenStarted)
    {
        LogMessage("StartListening: completed. "
                   "Listening on one or more addresses");

        return S_OK;
    }
    else
    {
        LogMessage("StartListening: completed. Not listening on any address.");

        return E_FAIL;
    }
}