Почему-то неполучается 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.
Здравствуйте, asdfgh, Вы писали:
A>Почему-то неполучается 2 раза сделать Play ! Люди помогите.
MCI_SEEK с флагом MCI_SEEK_TO_START перед вторым проигрыванием не пробовал?
... << RSDN@Home 1.0 beta 1 >>
Здравствуйте, cpp, Вы писали:
cpp>Люди! Ау! DirectShow скоро состариться, а вы звук все еще на MCI играете!
cpp>Сколько можно! Собери все цепочку аудио стрима и рули ей как хочешь.
cpp>Играй, перекодируй (MP1, MP2, MP3, WAV, AC3 Dolby etc.), микшируй, редактируй, накладывай эффекты
Человек же сказал — "как можно проще". Вот ты всегда на самолете в магазин летаешь или как?

... << RSDN@Home 1.0 beta 1 >>
Здравствуйте, IgorK, Вы писали:
IK>Здравствуйте, cpp, Вы писали:
cpp>>Люди! Ау! DirectShow скоро состариться, а вы звук все еще на MCI играете!
cpp>>Сколько можно! Собери все цепочку аудио стрима и рули ей как хочешь.
cpp>>Играй, перекодируй (MP1, MP2, MP3, WAV, AC3 Dolby etc.), микшируй, редактируй, накладывай эффекты
IK>Человек же сказал — "как можно проще". Вот ты всегда на самолете в магазин летаешь или как?
Лучше день потерять — потом за пять минут долететь
Спасибо!!! IgorK, Выручил!. Меня заклинило, не дошло, что надо пленку перемотать, после первого прослушивания

Все работает.
IK>MCI_SEEK с флагом MCI_SEEK_TO_START перед вторым проигрыванием не пробовал?
IK>
Здравствуйте, cpp, Вы писали:
cpp>[skip]
cpp>Сколько можно! Собери все цепочку аудио стрима и рули ей как хочешь.
Да, конечно, я так бы и сделал, Просто неприходилось раньше работать со звуком. А нужно от звука немного. А есть где-нибуть образцы "всей цепочки аудио стрима" с простой функциональностью? Я бы глянул. (это не важно, просто любопытство

)
Здравствуйте, 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...