mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
6.5 KiB
202 lines
6.5 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
|
//
|
|
// File: dsoundcapturebufferobj.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
// dSoundCaptureBufferObj.cpp : Implementation of CDirectApp and DLL registration.
|
|
// DHF_DS entire file
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "Direct.h"
|
|
#include "dSound.h"
|
|
|
|
#include "dms.h"
|
|
#include "dSoundObj.h"
|
|
#include "dSoundCaptureBufferObj.h"
|
|
#include "dSoundCaptureObj.h"
|
|
|
|
CONSTRUCTOR(_dxj_DirectSoundCaptureBuffer, {});
|
|
DESTRUCTOR(_dxj_DirectSoundCaptureBuffer, {});
|
|
GETSET_OBJECT(_dxj_DirectSoundCaptureBuffer);
|
|
|
|
STDMETHODIMP C_dxj_DirectSoundCaptureBufferObject::getCaps(DSCBCAPS_CDESC *caps)
|
|
{
|
|
((DSCBCAPS*)caps)->dwSize=sizeof(DSCBCAPS);
|
|
return m__dxj_DirectSoundCaptureBuffer->GetCaps((DSCBCAPS*)caps);
|
|
}
|
|
|
|
STDMETHODIMP C_dxj_DirectSoundCaptureBufferObject::getCurrentPosition(DSCURSORS_CDESC *desc)
|
|
{
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
if(!desc)
|
|
return E_POINTER;
|
|
|
|
return (m__dxj_DirectSoundCaptureBuffer->GetCurrentPosition((DWORD*)&desc->lPlay, (DWORD*)&desc->lWrite) );
|
|
}
|
|
|
|
|
|
STDMETHODIMP C_dxj_DirectSoundCaptureBufferObject::getStatus(long *stat)
|
|
{
|
|
return m__dxj_DirectSoundCaptureBuffer->GetStatus((DWORD*)stat);
|
|
}
|
|
|
|
STDMETHODIMP C_dxj_DirectSoundCaptureBufferObject::start(long flags)
|
|
{
|
|
return m__dxj_DirectSoundCaptureBuffer->Start((DWORD)flags);
|
|
}
|
|
|
|
STDMETHODIMP C_dxj_DirectSoundCaptureBufferObject::stop()
|
|
{
|
|
return m__dxj_DirectSoundCaptureBuffer->Stop();
|
|
}
|
|
|
|
STDMETHODIMP C_dxj_DirectSoundCaptureBufferObject::getFormat(WAVEFORMATEX_CDESC *format)
|
|
{
|
|
DWORD cb=0;
|
|
return m__dxj_DirectSoundCaptureBuffer->GetFormat((WAVEFORMATEX*)format,sizeof(WAVEFORMATEX_CDESC),&cb);
|
|
}
|
|
|
|
STDMETHODIMP C_dxj_DirectSoundCaptureBufferObject::initialize(I_dxj_DirectSoundCaptureBuffer *buffer,DSCBUFFERDESC_CDESC *desc)
|
|
{
|
|
((DSCBUFFERDESC*)desc)->dwSize=sizeof(DSCBUFFERDESC);
|
|
DO_GETOBJECT_NOTNULL(LPDIRECTSOUNDCAPTURE, lpref, buffer);
|
|
return m__dxj_DirectSoundCaptureBuffer->Initialize(lpref,(DSCBUFFERDESC*)desc);
|
|
}
|
|
|
|
STDMETHODIMP C_dxj_DirectSoundCaptureBufferObject::setNotificationPositions (long nElements,SAFEARRAY **ppsa)
|
|
{
|
|
if (!ISSAFEARRAY1D(ppsa,(DWORD)nElements))
|
|
return E_INVALIDARG;
|
|
|
|
HRESULT hr;
|
|
LPDIRECTSOUNDNOTIFY pDSN=NULL;
|
|
|
|
if (nElements == 0)
|
|
{
|
|
// There is absolutely nothing to do if we want to set 0 notification positions
|
|
return S_OK;
|
|
}
|
|
|
|
hr=m__dxj_DirectSoundCaptureBuffer->QueryInterface(IID_IDirectSoundNotify,(void**)&pDSN);
|
|
if FAILED(hr) return hr;
|
|
|
|
hr=pDSN->SetNotificationPositions((DWORD)nElements,(LPCDSBPOSITIONNOTIFY)((SAFEARRAY*)*ppsa)->pvData);
|
|
|
|
pDSN->Release();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//Java has no direct access to system memory, so it allocates it's own buffer
|
|
//which is passed into WriteBuffer(). Because the environment is now double
|
|
//buffered there is no need to Lock Java memory. WriteBuffer() calls
|
|
//both lock and Unlock internally to write the result after the fact.
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_DirectSoundCaptureBufferObject::writeBuffer(long start, long totsz,
|
|
void *buf, long flags)
|
|
{
|
|
#pragma message ("SoundBuffer writeBuffer ")
|
|
|
|
byte *buffer=(byte*)buf; //(byte*)((SAFEARRAY*)*ppsa)->pvData;
|
|
|
|
if(!buffer)
|
|
return E_POINTER;
|
|
|
|
LPVOID p1, p2;
|
|
DWORD size1=0, size2=0;
|
|
HRESULT val = E_FAIL;
|
|
__try {
|
|
DPF1(1,"----- DXVB: DSoundCaptureBuffer (WriteBuffer) Lock buffer (Total size = %d )\n",totsz);
|
|
if ((val = m__dxj_DirectSoundCaptureBuffer->Lock((DWORD)start, (DWORD)totsz, &p1, &size1, &p2, &size2,
|
|
(DWORD)flags)) != DS_OK)
|
|
return val;
|
|
|
|
// Copy to buffer end, then do a wrapped portion if it exists, then unlock
|
|
DPF1(1,"----- DXVB: DSoundCaptureBuffer (WriteBuffer) about to copy to buffer (size1 = %d )\n",size1);
|
|
if (p1)
|
|
{
|
|
DPF1(1,"----- DXVB: DSoundCaptureBuffer (WriteBuffer) about to copy to buffer (size1 = %d )\n",size1);
|
|
memcpy (p1, buffer, size1);
|
|
}
|
|
|
|
if (p2) //There was wrapping
|
|
{
|
|
DPF1(1,"----- DXVB: DSoundCaptureBuffer (WriteBuffer) about to copy to buffer (size2 = %d )\n",size2);
|
|
memcpy(p2, &buffer[size1], size2);
|
|
}
|
|
|
|
//docdoc: because Lock and Unlock are tied together within WriteBuffer,
|
|
// DSBufferDesc no longer needs to save Lock's system pointers.
|
|
DPF(1,"----- DXVB: DSoundCaptureBuffer (WriteBuffer) Unlocking buffer.\n");
|
|
val= m__dxj_DirectSoundCaptureBuffer->Unlock(p1, size1, p2, size2);
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
DPF(1,"----- DXVB: (WriteBuffer) Exception.\n");
|
|
return E_FAIL;
|
|
}
|
|
return val;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//Java has no direct access to system memory, so it allocates it's own buffer
|
|
//which is passed into WriteBuffer(). Because the environment is now double
|
|
//buffered there is no need to Lock Java memory. WriteBuffer() calls
|
|
//both lock and Unlock internally to write the result after the fact.
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP C_dxj_DirectSoundCaptureBufferObject::readBuffer(long start, long totsz,
|
|
void *buf, long flags)
|
|
{
|
|
|
|
//byte *buffer=(byte*)((SAFEARRAY*)*ppsa)->pvData;
|
|
byte *buffer=(byte*)buf;
|
|
|
|
if(!buffer)
|
|
return E_POINTER;
|
|
|
|
LPVOID p1 = NULL, p2 = NULL;
|
|
DWORD size1=0, size2=0;
|
|
HRESULT val = E_FAIL;
|
|
|
|
__try {
|
|
DPF1(1,"----- DXVB: DSoundCaptureBuffer (ReadBuffer) Lock buffer (Total size = %d )\n",totsz);
|
|
if ((val = m__dxj_DirectSoundCaptureBuffer->Lock((DWORD)start, (DWORD)totsz, &p1, &size1, &p2, &size2,
|
|
(DWORD)flags)) != DS_OK)
|
|
return val;
|
|
|
|
// Copy to buffer end, then do a wrapped portion if it exists, then unlock
|
|
if (p1)
|
|
{
|
|
DPF1(1,"----- DXVB: DSoundCaptureBuffer (ReadBuffer) about to copy to buffer (size1 = %d )\n",size1);
|
|
memcpy (buffer,p1, size1);
|
|
}
|
|
|
|
if (p2) //There was wrapping
|
|
{
|
|
DPF1(1,"----- DXVB: DSoundCaptureBuffer (ReadBuffer) about to copy to buffer (size2 = %d )\n",size2);
|
|
memcpy(&buffer[size1],p2, size2);
|
|
}
|
|
|
|
//docdoc: because Lock and Unlock are tied together within WriteBuffer,
|
|
// DSBufferDesc no longer needs to save Lock's system pointers.
|
|
DPF(1,"----- DXVB: DSoundCaptureBuffer (ReadBuffer) Unlocking buffer.\n");
|
|
val= m__dxj_DirectSoundCaptureBuffer->Unlock(p1, size1, p2, size2);
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
DPF(1,"----- DXVB: (ReadBuffer) Exception.\n");
|
|
return E_FAIL;
|
|
}
|
|
return val;
|
|
}
|
|
|