nim_duilib/tool_kits/shared/ring.cpp
2019-04-19 17:19:57 +08:00

114 lines
1.9 KiB
C++

#include "stdafx.h"
#include "ring.h"
#include "log.h"
#include "util.h"
static const std::wstring kNewMessage = L"new_message.wav";
static const std::wstring kVoipConnecting = L"voip_connecting.wav";
static const std::wstring kVoipNoResponse = L"voip_no_response.wav";
static const std::wstring kVoipPeerBusy = L"voip_peer_busy.wav";
static const std::wstring kVoipPeerReject = L"voip_peer_reject.wav";
static const std::wstring kVoipRing = L"voip_ring.wav";
namespace shared
{
Ring::Ring()
{
hwnd_ = NULL;
}
Ring::~Ring()
{
Destroy();
}
bool Ring::Init(HWND hwnd)
{
hwnd_ = MCIWndCreateW(hwnd, NULL, WS_POPUP | MCIWNDF_NOERRORDLG | MCIWNDF_NOTIFYMODE, NULL);
if (hwnd_ == NULL)
{
QLOG_ERR(L"MCIWndCreateW error {0}") << GetLastError();
return false;
}
return true;
}
void Ring::Play(RingType type, bool replay)
{
assert(hwnd_);
if (hwnd_ == NULL)
return;
Stop();
replay_ = replay;
std::wstring dir = QPath::GetAppPath() + L"res\\audio\\";
switch (type)
{
case RING_NEW_MESSAGE:
dir.append(kNewMessage);
break;
case RING_VOIP_CONNTETING:
dir.append(kVoipConnecting);
break;
case RING_VOIP_NORESPONSE:
dir.append(kVoipNoResponse);
break;
case RING_VOIP_PEERBUSY:
dir.append(kVoipPeerBusy);
break;
case RING_VOIP_PEERREJECT:
dir.append(kVoipPeerReject);
break;
case RING_VOIP_RING:
dir.append(kVoipRing);
break;
}
DWORD ret = MCIWndOpen(hwnd_, dir.c_str(), 0);
if (ret == 0)
MCIWndPlay(hwnd_);
else
QLOG_ERR(L"MCIWndOpen error {0}") << ret;
}
void Ring::Replay()
{
if (hwnd_ != NULL && MCIWndCanPlay(hwnd_))
{
MCIWndSeek(hwnd_, 0);
MCIWndPlay(hwnd_);
}
}
void Ring::Stop()
{
replay_ = false;
if (hwnd_)
{
MCIWndStop(hwnd_);
MCIWndClose(hwnd_);
}
}
void Ring::Destroy()
{
if (hwnd_)
{
Stop();
}
}
LRESULT Ring::Notify(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == MCIWNDM_NOTIFYMODE)
{
if (lParam == MCI_MODE_STOP && replay_)
{
Replay();
}
}
return 0;
}
}