90 lines
2.4 KiB
C++
90 lines
2.4 KiB
C++
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
///
|
|
/// BandiVideoLibrary 2.1
|
|
///
|
|
/// Copyright(C) 2008-2011 BandiSoft.com All rights reserved.
|
|
///
|
|
/// Visit http://www.bandisoft.com for more information.
|
|
///
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#pragma once
|
|
|
|
#define DIRECTSOUND_VERSION 0x0800
|
|
|
|
#include <dsound.h>
|
|
#include "bandivid.h"
|
|
|
|
|
|
class CBandiVideoSound_DS : public IBandiVideoSound
|
|
{
|
|
public:
|
|
static const UINT MAX_BUFFER_TIME = 200; // ms
|
|
static const UINT MIN_BUFFER_TIME = 20; // ms
|
|
|
|
static const UINT PLAY_SAMPLE_BLOCK = 1000;
|
|
static const UINT PLAY_SAMPLE_BLOCK_LEN = PLAY_SAMPLE_BLOCK*4;
|
|
|
|
CBandiVideoSound_DS();
|
|
virtual ~CBandiVideoSound_DS();
|
|
|
|
// IUnknown
|
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { return E_NOTIMPL; };
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
// IBandiVideoSound
|
|
HRESULT Open(INT channels, INT samplerate, IBandiVideoSoundCB *callback);
|
|
void Close();
|
|
HRESULT Start();
|
|
HRESULT Stop();
|
|
HRESULT Pause(BOOL pause);
|
|
HRESULT GetTime(INT64 &time);
|
|
HRESULT SetVolume(INT volume);
|
|
|
|
protected:
|
|
static unsigned WINAPI InitialThreadProc(LPVOID param)
|
|
{
|
|
CBandiVideoSound_DS *p = (CBandiVideoSound_DS*)param;
|
|
return p->ThreadProc();
|
|
};
|
|
UINT ThreadProc();
|
|
HRESULT PlayDS();
|
|
DWORD GetFreeBufferSize();
|
|
|
|
LONG m_ref_count;
|
|
|
|
HWND m_hwnd; // Window Handle
|
|
HINSTANCE m_hinst; // Instance Handle
|
|
LPDIRECTSOUND8 m_ds; // DirectSound Interface
|
|
LPDIRECTSOUNDBUFFER m_dsb_primary; // Primary buffer Interface
|
|
LPDIRECTSOUNDBUFFER m_dsb_secondary; // DirectSound secondary sound buffer
|
|
|
|
UINT m_channels; // Number of Channnel
|
|
UINT m_samplerate; // Sample rate;
|
|
|
|
INT m_outbuf_size_max;
|
|
INT m_outbuf_size_min;
|
|
|
|
UINT m_last_write_pos; // Last write offset (in BYTE)
|
|
|
|
INT m_inbuf_samples; // Number of samples in the buffer
|
|
INT m_total_samples; // Total number of written samples
|
|
|
|
LONGLONG m_cur_play_time; // 100nsec
|
|
|
|
CRITICAL_SECTION m_crit_sec;
|
|
BOOL m_crit_sec_inited;
|
|
|
|
HANDLE m_hevent;
|
|
HANDLE m_hthread;
|
|
UINT m_thread_id;
|
|
|
|
BOOL m_playing;
|
|
|
|
BYTE m_sample_block[PLAY_SAMPLE_BLOCK_LEN];
|
|
UINT m_sample_block_size;
|
|
|
|
IBandiVideoSoundCB* m_callback;
|
|
};
|