Added more tweaking capabilities in dsound channel.

ISDN privacy parameters made similar to SIP.


git-svn-id: http://yate.null.ro/svn/yate/trunk@666 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2006-01-26 17:43:02 +00:00
parent 0321a1f4f8
commit 1c16475e94
6 changed files with 328 additions and 33 deletions

View File

@ -40,13 +40,14 @@
using namespace TelEngine;
// we should use the primary sound buffer else we will lose sound while we have no input focus
#define USE_PRIMARY_BUFFER
static bool s_primary = true;
// 20ms chunk, 100ms buffer
#define CHUNK_SIZE 320
#define MIN_SIZE (3*CHUNK_SIZE)
#define BUF_SIZE (4*CHUNK_SIZE)
#define MAX_SIZE (5*CHUNK_SIZE)
static unsigned int s_chunk = CHUNK_SIZE;
static unsigned int s_minsize = 2*CHUNK_SIZE;
static unsigned int s_bufsize = 3*CHUNK_SIZE;
static unsigned int s_maxsize = 4*CHUNK_SIZE;
class DSoundSource : public DataSource
{
@ -181,11 +182,7 @@ bool DSoundPlay::init()
HWND wnd = GetForegroundWindow();
if (!wnd)
wnd = GetDesktopWindow();
#ifdef USE_PRIMARY_BUFFER
if (FAILED(hr = m_ds->SetCooperativeLevel(wnd,DSSCL_WRITEPRIMARY))) {
#else
if (FAILED(hr = m_ds->SetCooperativeLevel(wnd,DSSCL_EXCLUSIVE))) {
#endif
if (FAILED(hr = m_ds->SetCooperativeLevel(wnd,s_primary ? DSSCL_WRITEPRIMARY : DSSCL_EXCLUSIVE))) {
Debug(DebugGoOn,"Could not set the DirectSound cooperative level, code 0x%X",hr);
return false;
}
@ -200,23 +197,23 @@ bool DSoundPlay::init()
DSBUFFERDESC bdesc;
ZeroMemory(&bdesc, sizeof(bdesc));
bdesc.dwSize = sizeof(bdesc);
#ifdef USE_PRIMARY_BUFFER
bdesc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_STICKYFOCUS;
#else
bdesc.dwFlags = DSBCAPS_LOCSOFTWARE ;
bdesc.dwBufferBytes = BUF_SIZE;
bdesc.lpwfxFormat = &fmt;
#endif
if (s_primary)
bdesc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_STICKYFOCUS;
else {
bdesc.dwFlags = DSBCAPS_GLOBALFOCUS;
// we have to set format when creating secondary buffers
bdesc.dwBufferBytes = s_bufsize;
bdesc.lpwfxFormat = &fmt;
}
if (FAILED(hr = m_ds->CreateSoundBuffer(&bdesc, &m_dsb, NULL)) || !m_dsb) {
Debug(DebugGoOn,"Could not create the DirectSound buffer, code 0x%X",hr);
return false;
}
#ifdef USE_PRIMARY_BUFFER
if (FAILED(hr = m_dsb->SetFormat(&fmt))) {
// format can be changed only for primary buffers
if (s_primary && FAILED(hr = m_dsb->SetFormat(&fmt))) {
Debug(DebugGoOn,"Could not set the DirectSound buffer format, code 0x%X",hr);
return false;
}
#endif
if (FAILED(hr = m_dsb->GetFormat(&fmt,sizeof(fmt),0))) {
Debug(DebugGoOn,"Could not get the DirectSound buffer format, code 0x%X",hr);
return false;
@ -259,19 +256,19 @@ void DSoundPlay::run()
while (m_owner) {
msleep(1,true);
if (first) {
if (m_buf.length() < MIN_SIZE)
if (m_buf.length() < s_minsize)
continue;
first = false;
m_dsb->GetCurrentPosition(NULL,&m_writePos);
Debug(&__plugin,DebugAll,"DSoundPlay has %u in buffer and starts playing at %u",
m_buf.length(),m_writePos);
}
while (m_dsb && (m_buf.length() >= CHUNK_SIZE)) {
while (m_dsb && (m_buf.length() >= s_chunk)) {
void* buf = 0;
void* buf2 = 0;
DWORD len = 0;
DWORD len2 = 0;
HRESULT hr = m_dsb->Lock(m_writePos,CHUNK_SIZE,&buf,&len,&buf2,&len2,0);
HRESULT hr = m_dsb->Lock(m_writePos,s_chunk,&buf,&len,&buf2,&len2,0);
if (FAILED(hr)) {
m_writePos = 0;
if ((hr == DSERR_BUFFERLOST) && SUCCEEDED(m_dsb->Restore())) {
@ -292,10 +289,10 @@ void DSoundPlay::run()
if (buf2)
::memcpy(buf2,((const char*)m_buf.data())+len,len2);
m_dsb->Unlock(buf,len,buf2,len2);
m_writePos += CHUNK_SIZE;
m_writePos += s_chunk;
if (m_writePos >= m_buffSize)
m_writePos -= m_buffSize;
m_buf.cut(-CHUNK_SIZE);
m_buf.cut(-(int)s_chunk);
unlock();
XDebug(&__plugin,DebugAll,"Locked %p,%d %p,%d",buf,len,buf2,len2);
}
@ -322,7 +319,7 @@ void DSoundPlay::put(const DataBlock& data)
if (!m_dsb)
return;
lock();
if (m_buf.length() + data.length() <= MAX_SIZE)
if (m_buf.length() + data.length() <= s_maxsize)
m_buf += data;
#ifdef DDEBUG
else
@ -332,7 +329,7 @@ void DSoundPlay::put(const DataBlock& data)
}
DSoundRec::DSoundRec(DSoundSource* owner, LPGUID device)
: Thread("DirectSound Rec"),
: Thread("DirectSound Rec",High),
m_owner(owner), m_device(device), m_ds(0), m_dsb(0),
m_buffSize(0), m_readPos(0)
{
@ -372,7 +369,7 @@ bool DSoundRec::init()
ZeroMemory(&bdesc, sizeof(bdesc));
bdesc.dwSize = sizeof(bdesc);
bdesc.dwFlags = DSCBCAPS_WAVEMAPPED;
bdesc.dwBufferBytes = BUF_SIZE;
bdesc.dwBufferBytes = s_bufsize;
bdesc.lpwfxFormat = &fmt;
if (FAILED(hr = m_ds->CreateCaptureBuffer(&bdesc, &m_dsb, NULL)) || !m_dsb) {
Debug(DebugGoOn,"Could not create the DirectSoundCapture buffer, code 0x%X",hr);
@ -422,13 +419,13 @@ void DSoundRec::run()
if (pos < m_readPos)
pos += m_buffSize;
pos -= m_readPos;
if (pos < CHUNK_SIZE)
if (pos < s_chunk)
continue;
void* buf = 0;
void* buf2 = 0;
DWORD len = 0;
DWORD len2 = 0;
if (FAILED(m_dsb->Lock(m_readPos,CHUNK_SIZE,&buf,&len,&buf2,&len2,0)))
if (FAILED(m_dsb->Lock(m_readPos,s_chunk,&buf,&len,&buf2,&len2,0)))
continue;
DataBlock data(0,len+len2);
::memcpy(data.data(),buf,len);
@ -629,6 +626,19 @@ void SoundDriver::initialize()
setup(0,true); // no need to install notifications
Driver::initialize();
if (!m_handler) {
Configuration cfg(Engine::configFile("dsoundchan"));
s_chunk = cfg.getIntValue("general","chunk",CHUNK_SIZE);
// make sure the chunk is even sized
s_chunk &= ~1;
// and set some decent limits for it (5-100 ms)
if (s_chunk < 80)
s_chunk = 80;
if (s_chunk > 1600)
s_chunk = 1600;
s_minsize = cfg.getIntValue("general","minsize",2*s_chunk);
s_bufsize = cfg.getIntValue("general","bufsize",3*s_chunk);
s_maxsize = cfg.getIntValue("general","maxsize",4*s_chunk);
s_primary = cfg.getBoolValue("general","primary",true);
m_handler = new AttachHandler;
Engine::install(m_handler);
}

View File

@ -24,6 +24,19 @@
#include <modules/libypri.h>
/* Individual bit groups in number presentation - Q931 octet 3a bits 7,6 */
#define PRESENTATION_BIT_MASK 0x60
#define PRESENTATION_ALLOWED 0x00
#define PRESENTATION_RESTRICTED 0x20
#define PRESENTATION_UNAVAILABLE 0x40
/* Individual bit groups in number screening - Q931 octet 3a bits 2,1 */
#define SCREENING_BIT_MASK 0x03
#define SCREENING_USER_NOT_SCREENED 0x00
#define SCREENING_USER_PASSED 0x01
#define SCREENING_USER_FAILED 0x02
#define SCREENING_NETWORK_PROVIDED 0x03
extern "C" {
extern int q931_setup(struct pri *pri, q931_call *c, struct pri_sr *req);
};
@ -116,7 +129,7 @@ static TokenDict dict_str2dplan[] = {
{ 0, -1 }
};
/* Presentation */
/* Presentation and screening */
static TokenDict dict_str2pres[] = {
{ "allow_user_not_screened", PRES_ALLOWED_USER_NUMBER_NOT_SCREENED },
{ "allow_user_passed", PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN },
@ -130,6 +143,7 @@ static TokenDict dict_str2pres[] = {
{ 0, -1 }
};
#ifdef PRI_NSF_NONE
#define YATE_NSF_DEFAULT PRI_NSF_NONE
#else
@ -824,7 +838,15 @@ bool PriChan::call(Message &msg, const char *called)
char *caller = (char *)msg.getValue("caller");
int callerplan = msg.getIntValue("callerplan",dict_str2dplan,m_span->dplan());
char *callername = (char *)msg.getValue("callername");
int callerpres = msg.getIntValue("callerpres",dict_str2pres,m_span->pres());
int callerpres = m_span->pres();
String tmp = msg.getValue("screened");
if (tmp.isBoolean())
callerpres = (callerpres & ~SCREENING_BIT_MASK) |
(tmp.toBoolean() ? SCREENING_USER_PASSED : SCREENING_USER_NOT_SCREENED);
tmp = msg.getValue("privacy");
if (tmp && tmp.toBoolean(true))
callerpres = (callerpres & ~PRESENTATION_BIT_MASK) | PRESENTATION_RESTRICTED;
callerpres = msg.getIntValue("presentation",dict_str2pres,callerpres);
int calledplan = msg.getIntValue("calledplan",dict_str2dplan,m_span->dplan());
Debug(this,DebugAll,"Caller='%s' name='%s' plan=%s pres=%s, Called plan=%s",
caller,callername,lookup(callerplan,dict_str2dplan),
@ -882,6 +904,8 @@ void PriChan::ring(pri_event_ring &ev)
openData(lookup(ev.layer1,dict_str2law),0);
m = message("call.preroute");
m->addParam("span",String(m_span->span()));
m->addParam("channel",String(m_chan));
if (m_span->overlapped() && !ev.complete && (::strlen(ev.callednum) < m_span->overlapped())) {
::pri_need_more_info(m_span->pri(),m_call,m_chan,!isISDN());
m->addParam("overlapped","yes");
@ -890,6 +914,16 @@ void PriChan::ring(pri_event_ring &ev)
m->addParam("caller",ev.callingnum);
if (ev.callednum[0])
m->addParam("called",ev.callednum);
if ((ev.callingpres & PRESENTATION_BIT_MASK) == PRESENTATION_RESTRICTED)
m->addParam("privacy","name");
switch (ev.callingpres & SCREENING_BIT_MASK) {
case SCREENING_USER_PASSED:
m->addParam("screened","yes");
break;
case SCREENING_USER_NOT_SCREENED:
m->addParam("screened","no");
break;
}
const char* dataLaw = "slin";
switch (ev.layer1) {
case PRI_LAYER_1_ALAW:

View File

@ -191,6 +191,9 @@ Package=<4>
Begin Project Dependency
Project_Dep_Name _ilbccodec
End Project Dependency
Begin Project Dependency
Project_Dep_Name _dbpbx
End Project Dependency
}}}
###############################################################################
@ -312,6 +315,24 @@ Package=<4>
###############################################################################
Project: "_dbpbx"=.\_dbpbx.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name Libyate
End Project Dependency
Begin Project Dependency
Project_Dep_Name libypbx
End Project Dependency
}}}
###############################################################################
Project: "_dsoundchan"=.\_dsoundchan.dsp - Package Owner=<4>
Package=<5>
@ -633,6 +654,21 @@ Package=<4>
###############################################################################
Project: "libypbx"=.\libypbx.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name Libyate
End Project Dependency
}}}
###############################################################################
Project: "libypri"=.\libypri.dsp - Package Owner=<4>
Package=<5>

113
windows/_dbpbx.dsp Normal file
View File

@ -0,0 +1,113 @@
# Microsoft Developer Studio Project File - Name="_dbpbx" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=_dbpbx - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "_dbpbx.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "_dbpbx.mak" CFG="_dbpbx - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "_dbpbx - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "_dbpbx - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "_dbpbx - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "_dbpbx___Win32_Release"
# PROP BASE Intermediate_Dir "_dbpbx___Win32_Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release\modules"
# PROP Ignore_Export_Lib 1
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_dbpbx_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MD /W3 /O2 /I "." /I ".." /I "..\contrib\ypbx" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBYPBX_STATIC" /FD /c
# SUBTRACT CPP /YX
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib Release/libypbx.lib /nologo /dll /machine:I386 /out:"Release/dbpbx.yate"
!ELSEIF "$(CFG)" == "_dbpbx - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "_dbpbx___Win32_Debug"
# PROP BASE Intermediate_Dir "_dbpbx___Win32_Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug\modules"
# PROP Ignore_Export_Lib 1
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_dbpbx_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "." /I ".." /I "..\contrib\ypbx" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBYPBX_STATIC" /FD /GZ /c
# SUBTRACT CPP /YX
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib Debug/libypbx.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"Debug/dbpbx.yate" /pdbtype:sept
!ENDIF
# Begin Target
# Name "_dbpbx - Win32 Release"
# Name "_dbpbx - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=..\modules\dbpbx.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# Begin Source File
SOURCE=.\version.rc
# End Source File
# End Group
# End Target
# End Project

102
windows/libypbx.dsp Normal file
View File

@ -0,0 +1,102 @@
# Microsoft Developer Studio Project File - Name="libypbx" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=libypbx - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "libypbx.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "libypbx.mak" CFG="libypbx - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "libypbx - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "libypbx - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "libypbx - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "libypbx___Win32_Release"
# PROP BASE Intermediate_Dir "libypbx___Win32_Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release\ypbx"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MD /W3 /O2 /I "." /I ".." /I "..\contrib\ypbx" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "LIBYPBX_STATIC" /FD /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ELSEIF "$(CFG)" == "libypbx - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "libypbx___Win32_Debug"
# PROP BASE Intermediate_Dir "libypbx___Win32_Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug\ypbx"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "." /I ".." /I "..\contrib\ypbx" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "LIBYPBX_STATIC" /FR /FD /GZ /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ENDIF
# Begin Target
# Name "libypbx - Win32 Release"
# Name "libypbx - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=..\contrib\ypbx\multiroute.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=..\contrib\ypbx\yatepbx.h
# End Source File
# End Group
# End Target
# End Project

View File

@ -41,7 +41,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MD /W3 /O2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c
# ADD CPP /nologo /MD /W3 /O2 /I "." /I ".." /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "LIBYPRI_STATIC" /FD /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
@ -65,7 +65,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "." /I ".." /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "LIBYPRI_STATIC" /FR /FD /GZ /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"