Re[3]: Не вывести звук (Wav) более одного раза. Где ошибка?
От: cpp Россия http://www.elecard.com
Дата: 10.12.02 09:21
Оценка:
Здравствуйте, asdfgh, Вы писали:

A>Здравствуйте, cpp, Вы писали:


cpp>>[skip]


cpp>>Сколько можно! Собери все цепочку аудио стрима и рули ей как хочешь.


A>Да, конечно, я так бы и сделал, Просто неприходилось раньше работать со звуком. А нужно от звука немного. А есть где-нибуть образцы "всей цепочки аудио стрима" с простой функциональностью? Я бы глянул. (это не важно, просто любопытство )


Примерно так (дальше писать лень):


//some.h

///////////////////////////// DirectShow interfaces //////////////////////////

    //GraphBuilder interface
    IGraphBuilder    *pGraphBuilder;

    //MediaControl interface
    IMediaControl    *pMediaControl;

    //MediaEventEx interface
    IMediaEventEx    *pMediaEventEx;

    //BasicAudio interface
    IBasicAudio    *pBasicAudio;

    //MediaSeeking interface
    IMediaSeeking    *pMediaSeeking;

    //MediaPosition interface
    IMediaPosition    *pMediaPosition;


//some.cpp
//-------------------------------------------------------------------------------------
// Init necessary interfaces
//-------------------------------------------------------------------------------------
HRESULT CDemoAppDlg::InitDirectShow()
{
    HRESULT hr = S_OK;

    JIF(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&pGraphBuilder));
    JIF(pGraphBuilder->QueryInterface(IID_IMediaControl,  (void **)&pMediaControl));
    JIF(pGraphBuilder->QueryInterface(IID_IMediaSeeking,  (void **)&pMediaSeeking));
    JIF(pGraphBuilder->QueryInterface(IID_IBasicAudio,      (void **)&pBasicAudio));
    JIF(pGraphBuilder->QueryInterface(IID_IMediaEventEx,  (void **)&pMediaEventEx));

    return S_OK;

CLEANUP:
    FreeDirectShow();
    return hr;
}


//-------------------------------------------------------------------------------------
// Free all interfaces
//-------------------------------------------------------------------------------------
HRESULT CDemoAppDlg::FreeDirectShow()
{
    HRESULT hr = S_OK;

    StopSeekTimer();
    StopMedia();

    // Disable event callbacks
    if (pMediaEventEx)
    {
        hr = pMediaEventEx->SetNotifyWindow((OAHWND)NULL, 0, 0);
    }

    // Release all other dshow interfaces
    SAFE_RELEASE(pMediaControl);
    SAFE_RELEASE(pMediaSeeking);
    SAFE_RELEASE(pBasicAudio);
    SAFE_RELEASE(pMediaEventEx);
    SAFE_RELEASE(pGraphBuilder);

    return hr;
}

//-------------------------------------------------------------------------------------
// Prepares media for rendering
//-------------------------------------------------------------------------------------
HRESULT CDemoAppDlg::PrepareMedia(LPTSTR lpszMovie)
{
    USES_CONVERSION;
    HRESULT hr = S_OK;

    // Allow DirectShow to create the FilterGraph for this media file
    LIF(pGraphBuilder->RenderFile(T2W(lpszMovie), NULL));

    // Remember play state
    m_StateFlag = Stopped;

    return hr;
}


//-------------------------------------------------------------------------------------
// Play | Pause media
//-------------------------------------------------------------------------------------
void CDemoAppDlg::OnPlay()
{
    HRESULT hr = S_OK;

    // if current state isn't Running then play the movie
    if (m_StateFlag != Running)
    {
        hr = PlayMedia();
    }
    else // else pause it
        hr = PauseMedia();
    }
}

//-------------------------------------------------------------------------------------
// Inaternal
//-------------------------------------------------------------------------------------
HRESULT CDemoAppDlg::PlayMedia()
{
    HRESULT hr = S_OK;

    if (!g_wTimerID)
    {
        StartSeekTimer();
    }

    // some checks
    if (!pMediaControl || m_StateFlag == Running)
    {
        return hr;
    }

    // Start playback
    LIF(pMediaControl->Run());

    // Remember play state
    m_StateFlag = Running;
    SetEnableStates();

    // next click for play
    m_PlayBtn.SetWindowText("Pause");

    return hr;
}



//-------------------------------------------------------------------------------------
// Internal
//-------------------------------------------------------------------------------------
HRESULT CDemoAppDlg::PauseMedia()
{
    HRESULT hr = S_OK;

    if (!g_wTimerID)
    {
        StartSeekTimer();
    }

    // some checks
    if (!pMediaControl || m_StateFlag == Paused)
    {
        return hr;
    }

    LIF(pMediaControl->Pause());

    // Remember play state
    m_StateFlag = Paused;
    SetEnableStates();

    // next click for play
    m_PlayBtn.SetWindowText("Play");

    return hr;
}



and so on...
Сергей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.