Не вывести звук (Wav) более одного раза. Где ошибка?
От: asdfgh  
Дата: 09.12.02 14:19
Оценка:
Почему-то неполучается 2 раза сделать Play ! Люди помогите.

Задачка проста: проигрывать звук. Надо как можно проще. Функциональность: play, stop, pause, resume, +callback на окончание проигрывания. Поэтому PlaySound() неподходит.

Пытаюсь воспользоваться функциями mci...()

1) mciSendCommand(0, MCI_OPEN, ...
проходит, возвращает "Всё O.K."
2) err = mciSendCommand(..., MCI_PLAY, ...
проходит! Звук играет как нужно, возвращает "Всё O.K."
3) ждем на всякий случай некоторое время после окончания проигрывания...
4) повторяем 2)
НЕ ПРОХОДИТ! Звук неиграется, однако возвращается опять "Всё O.K."

Почему нельзя звук проиграть дважды?
mciSendCommand(..., MCI_STOP, ... между п3) и п4) непомогает.
MSDN молчит..
Закрыть, потом открыть — помогает. Но это кажется кривым решением.


_______________________________________________
Код, если кому интересно:

MCI_WAVE_OPEN_PARMS open_parms;
DWORD flags = 0;
MCIERROR err;

open_parms.dwCallback = (DWORD_PTR)0;
open_parms.wDeviceID = (MCIDEVICEID)0;
open_parms.lpstrDeviceType = (LPCWSTR)(DWORD)MCI_DEVTYPE_WAVEFORM_AUDIO;
open_parms.lpstrElementName = (LPCWSTR)L"1.wav";
open_parms.lpstrAlias = (LPCWSTR)NULL;
open_parms.dwBufferSeconds = (DWORD)0;

flags = MCI_OPEN_TYPE |
MCI_OPEN_TYPE_ID |
MCI_OPEN_ELEMENT |
MCI_WAIT;

err =
mciSendCommand(0,
MCI_OPEN,
flags,
(DWORD)(LPVOID)open_parms
);

/* some time interval ... */
MCI_PLAY_PARMS playParams;
MCIDEVICEID devID = open_parms.wDeviceID;
playParams.dwCallback = 0;
playParams.dwFrom = 0;
playParams.dwTo = 0;

err = mciSendCommand(devID,
MCI_PLAY,
(DWORD)MCI_WAIT,
(DWORD)(LPVOID)&playParams
); // играет, возвращает 0.

/* some time interval ... (жду пару минут после окончания игры) */
err = mciSendCommand(devID,
MCI_PLAY,
(DWORD)MCI_WAIT,
(DWORD)(LPVOID)&playParams
); // НЕ играет, возвращает тоже 0.
Re: Не вывести звук (Wav) более одного раза. Где ошибка?
От: IgorK Россия  
Дата: 09.12.02 14:27
Оценка:
Здравствуйте, asdfgh, Вы писали:

A>Почему-то неполучается 2 раза сделать Play ! Люди помогите.


MCI_SEEK с флагом MCI_SEEK_TO_START перед вторым проигрыванием не пробовал?
... << RSDN@Home 1.0 beta 1 >>
Re: Не вывести звук (Wav) более одного раза. Где ошибка?
От: cpp Россия http://www.elecard.com
Дата: 09.12.02 14:38
Оценка:
Здравствуйте, asdfgh, Вы писали:

[skip]

Люди! Ау! DirectShow скоро состариться, а вы звук все еще на MCI играете!
Сколько можно! Собери все цепочку аудио стрима и рули ей как хочешь.
Играй, перекодируй (MP1, MP2, MP3, WAV, AC3 Dolby etc.), микшируй, редактируй, накладывай эффекты!
Сергей.
Re[2]: Не вывести звук (Wav) более одного раза. Где ошибка?
От: IgorK Россия  
Дата: 09.12.02 14:47
Оценка:
Здравствуйте, cpp, Вы писали:

cpp>Люди! Ау! DirectShow скоро состариться, а вы звук все еще на MCI играете!

cpp>Сколько можно! Собери все цепочку аудио стрима и рули ей как хочешь.
cpp>Играй, перекодируй (MP1, MP2, MP3, WAV, AC3 Dolby etc.), микшируй, редактируй, накладывай эффекты
Человек же сказал — "как можно проще". Вот ты всегда на самолете в магазин летаешь или как?
... << RSDN@Home 1.0 beta 1 >>
Re[3]: Не вывести звук (Wav) более одного раза. Где ошибка?
От: cpp Россия http://www.elecard.com
Дата: 09.12.02 18:26
Оценка:
Здравствуйте, IgorK, Вы писали:

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


cpp>>Люди! Ау! DirectShow скоро состариться, а вы звук все еще на MCI играете!

cpp>>Сколько можно! Собери все цепочку аудио стрима и рули ей как хочешь.
cpp>>Играй, перекодируй (MP1, MP2, MP3, WAV, AC3 Dolby etc.), микшируй, редактируй, накладывай эффекты
IK>Человек же сказал — "как можно проще". Вот ты всегда на самолете в магазин летаешь или как?

Лучше день потерять — потом за пять минут долететь
Сергей.
Re[2]: Не вывести звук (Wav) более одного раза. Где ошибка?
От: asdfgh  
Дата: 10.12.02 06:02
Оценка:
Спасибо!!! IgorK, Выручил!. Меня заклинило, не дошло, что надо пленку перемотать, после первого прослушивания
Все работает.


IK>MCI_SEEK с флагом MCI_SEEK_TO_START перед вторым проигрыванием не пробовал?


IK>
Re[2]: Не вывести звук (Wav) более одного раза. Где ошибка?
От: asdfgh  
Дата: 10.12.02 06:30
Оценка:
Здравствуйте, cpp, Вы писали:

cpp>[skip]


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


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