summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2008-09-17 14:49:21 +0000
committerNanang Izzuddin <nanang@teluu.com>2008-09-17 14:49:21 +0000
commit85e32856f0f9b30fe2366587c9d7180f2bbbcdd2 (patch)
tree26d364b80904966249587180c241a377b681657a /pjmedia
parent328ca512b0b590367073350ff094419617482f4b (diff)
Ticket #630: Added Win32 MME sound device wrapper (thanks Seth Hinze for the patch).
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2290 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/build/pjmedia.dsp4
-rw-r--r--pjmedia/build/pjmedia.vcproj4
-rw-r--r--pjmedia/build/wince-evc4/pjmedia_wince.vcp827
-rw-r--r--pjmedia/include/pjmedia/config.h6
-rw-r--r--pjmedia/src/pjmedia/wmme_sound.c1006
5 files changed, 1796 insertions, 51 deletions
diff --git a/pjmedia/build/pjmedia.dsp b/pjmedia/build/pjmedia.dsp
index 5e608f29..844938f3 100644
--- a/pjmedia/build/pjmedia.dsp
+++ b/pjmedia/build/pjmedia.dsp
@@ -293,6 +293,10 @@ SOURCE=..\src\pjmedia\wave.c
# End Source File
# Begin Source File
+SOURCE=..\src\pjmedia\wmme_sound.c
+# End Source File
+# Begin Source File
+
SOURCE=..\src\pjmedia\wsola.c
# End Source File
# End Group
diff --git a/pjmedia/build/pjmedia.vcproj b/pjmedia/build/pjmedia.vcproj
index 281ec6b7..36796a64 100644
--- a/pjmedia/build/pjmedia.vcproj
+++ b/pjmedia/build/pjmedia.vcproj
@@ -1096,6 +1096,10 @@
</FileConfiguration>
</File>
<File
+ RelativePath="..\src\pjmedia\wmme_sound.c"
+ >
+ </File>
+ <File
RelativePath="..\src\pjmedia\wsola.c"
>
</File>
diff --git a/pjmedia/build/wince-evc4/pjmedia_wince.vcp b/pjmedia/build/wince-evc4/pjmedia_wince.vcp
index 917d7bde..ba00a90d 100644
--- a/pjmedia/build/wince-evc4/pjmedia_wince.vcp
+++ b/pjmedia/build/wince-evc4/pjmedia_wince.vcp
@@ -5850,9 +5850,9 @@ DEP_CPP_ECHO_S=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_echo.h"\
- "..\..\..\third_party\speex\include\speex\speex_preprocess.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_echo.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_preprocess.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\echo.h"\
@@ -6021,9 +6021,9 @@ DEP_CPP_ECHO_S=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_echo.h"\
- "..\..\..\third_party\speex\include\speex\speex_preprocess.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_echo.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_preprocess.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\echo.h"\
@@ -6098,9 +6098,9 @@ DEP_CPP_ECHO_S=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_echo.h"\
- "..\..\..\third_party\speex\include\speex\speex_preprocess.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_echo.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_preprocess.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\echo.h"\
@@ -6316,9 +6316,9 @@ DEP_CPP_ECHO_S=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_echo.h"\
- "..\..\..\third_party\speex\include\speex\speex_preprocess.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_echo.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_preprocess.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\echo.h"\
@@ -7562,7 +7562,7 @@ DEP_CPP_ERRNO=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\portaudio\include\portaudio.h"\
+ "..\..\..\THIRD_PARTY\portaudio\include\portaudio.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -7706,7 +7706,7 @@ DEP_CPP_ERRNO=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\portaudio\include\portaudio.h"\
+ "..\..\..\THIRD_PARTY\portaudio\include\portaudio.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -7778,7 +7778,7 @@ DEP_CPP_ERRNO=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\portaudio\include\portaudio.h"\
+ "..\..\..\THIRD_PARTY\portaudio\include\portaudio.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -7958,7 +7958,7 @@ DEP_CPP_ERRNO=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\portaudio\include\portaudio.h"\
+ "..\..\..\THIRD_PARTY\portaudio\include\portaudio.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -11460,7 +11460,7 @@ DEP_CPP_PASOU=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\portaudio\include\portaudio.h"\
+ "..\..\..\THIRD_PARTY\portaudio\include\portaudio.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -11607,7 +11607,7 @@ DEP_CPP_PASOU=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\portaudio\include\portaudio.h"\
+ "..\..\..\THIRD_PARTY\portaudio\include\portaudio.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -11680,7 +11680,7 @@ DEP_CPP_PASOU=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\portaudio\include\portaudio.h"\
+ "..\..\..\THIRD_PARTY\portaudio\include\portaudio.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -11864,7 +11864,7 @@ DEP_CPP_PASOU=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\portaudio\include\portaudio.h"\
+ "..\..\..\THIRD_PARTY\portaudio\include\portaudio.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -13624,7 +13624,7 @@ DEP_CPP_RESAMP=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\resample\include\resamplesubs.h"\
+ "..\..\..\THIRD_PARTY\resample\include\resamplesubs.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -13697,7 +13697,7 @@ DEP_CPP_RESAMP=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\resample\include\resamplesubs.h"\
+ "..\..\..\THIRD_PARTY\resample\include\resamplesubs.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -13760,7 +13760,7 @@ DEP_CPP_RESAMP=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\resample\include\resamplesubs.h"\
+ "..\..\..\THIRD_PARTY\resample\include\resamplesubs.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -13822,7 +13822,7 @@ DEP_CPP_RESAMP=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\resample\include\resamplesubs.h"\
+ "..\..\..\THIRD_PARTY\resample\include\resamplesubs.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -13895,7 +13895,7 @@ DEP_CPP_RESAMP=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\resample\include\resamplesubs.h"\
+ "..\..\..\THIRD_PARTY\resample\include\resamplesubs.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -13969,7 +13969,7 @@ DEP_CPP_RESAMP=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\resample\include\resamplesubs.h"\
+ "..\..\..\THIRD_PARTY\resample\include\resamplesubs.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -14032,7 +14032,7 @@ DEP_CPP_RESAMP=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\resample\include\resamplesubs.h"\
+ "..\..\..\THIRD_PARTY\resample\include\resamplesubs.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -14094,7 +14094,7 @@ DEP_CPP_RESAMP=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\resample\include\resamplesubs.h"\
+ "..\..\..\THIRD_PARTY\resample\include\resamplesubs.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -14156,7 +14156,7 @@ DEP_CPP_RESAMP=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\resample\include\resamplesubs.h"\
+ "..\..\..\THIRD_PARTY\resample\include\resamplesubs.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -14229,7 +14229,7 @@ DEP_CPP_RESAMP=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\resample\include\resamplesubs.h"\
+ "..\..\..\THIRD_PARTY\resample\include\resamplesubs.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -14299,8 +14299,8 @@ DEP_CPP_RESAMPL=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_resampler.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_resampler.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -14373,8 +14373,8 @@ DEP_CPP_RESAMPL=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_resampler.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_resampler.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -14437,8 +14437,8 @@ DEP_CPP_RESAMPL=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_resampler.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_resampler.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -14500,8 +14500,8 @@ DEP_CPP_RESAMPL=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_resampler.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_resampler.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -14574,8 +14574,8 @@ DEP_CPP_RESAMPL=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_resampler.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_resampler.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -14649,8 +14649,8 @@ DEP_CPP_RESAMPL=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_resampler.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_resampler.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -14713,8 +14713,8 @@ DEP_CPP_RESAMPL=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_resampler.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_resampler.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -14776,8 +14776,8 @@ DEP_CPP_RESAMPL=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_resampler.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_resampler.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -14839,8 +14839,8 @@ DEP_CPP_RESAMPL=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_resampler.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_resampler.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\errno.h"\
"..\..\include\pjmedia\port.h"\
@@ -14913,8 +14913,8 @@ DEP_CPP_RESAMPL=\
"..\..\..\pjlib\include\pj\types.h"\
"..\..\..\pjlib\include\pj\unicode.h"\
"..\..\..\pjlib\include\pjlib.h"\
- "..\..\..\third_party\speex\include\speex\speex_resampler.h"\
- "..\..\..\third_party\speex\include\speex\speex_types.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_resampler.h"\
+ "..\..\..\THIRD_PARTY\speex\include\speex\speex_types.h"\
"..\..\include\pjmedia\config.h"\
"..\..\include\pjmedia\config_auto.h"\
"..\..\include\pjmedia\errno.h"\
@@ -28757,6 +28757,733 @@ DEP_CPP_WAVE_=\
# End Source File
# Begin Source File
+SOURCE=..\..\src\pjmedia\wmme_sound.c
+
+!IF "$(CFG)" == "pjmedia_wince - Win32 (WCE emulator) Release"
+
+DEP_CPP_WMME_=\
+ "..\..\..\pjlib\include\pj\activesock.h"\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\math.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjmedia\config.h"\
+ "..\..\include\pjmedia\config_auto.h"\
+ "..\..\include\pjmedia\errno.h"\
+ "..\..\include\pjmedia\sound.h"\
+ "..\..\include\pjmedia\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjmedia_wince - Win32 (WCE emulator) Debug"
+
+DEP_CPP_WMME_=\
+ "..\..\..\pjlib\include\pj\activesock.h"\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\math.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjmedia\config.h"\
+ "..\..\include\pjmedia\config_auto.h"\
+ "..\..\include\pjmedia\errno.h"\
+ "..\..\include\pjmedia\sound.h"\
+ "..\..\include\pjmedia\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjmedia_wince - Win32 (WCE ARMV4I) Release"
+
+DEP_CPP_WMME_=\
+ "..\..\..\pjlib\include\pj\activesock.h"\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\math.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjmedia\config.h"\
+ "..\..\include\pjmedia\config_auto.h"\
+ "..\..\include\pjmedia\errno.h"\
+ "..\..\include\pjmedia\sound.h"\
+ "..\..\include\pjmedia\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjmedia_wince - Win32 (WCE ARMV4I) Debug"
+
+DEP_CPP_WMME_=\
+ "..\..\..\pjlib\include\pj\activesock.h"\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\math.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjmedia\config.h"\
+ "..\..\include\pjmedia\config_auto.h"\
+ "..\..\include\pjmedia\errno.h"\
+ "..\..\include\pjmedia\sound.h"\
+ "..\..\include\pjmedia\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjmedia_wince - Win32 (WCE ARMV4) Release"
+
+DEP_CPP_WMME_=\
+ "..\..\..\pjlib\include\pj\activesock.h"\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\math.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjmedia\config.h"\
+ "..\..\include\pjmedia\config_auto.h"\
+ "..\..\include\pjmedia\errno.h"\
+ "..\..\include\pjmedia\sound.h"\
+ "..\..\include\pjmedia\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjmedia_wince - Win32 (WCE ARMV4) Debug"
+
+DEP_CPP_WMME_=\
+ "..\..\..\pjlib\include\pj\activesock.h"\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\math.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjmedia\config.h"\
+ "..\..\include\pjmedia\config_auto.h"\
+ "..\..\include\pjmedia\errno.h"\
+ "..\..\include\pjmedia\sound.h"\
+ "..\..\include\pjmedia\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjmedia_wince - Win32 (WCE ARMV4T) Release"
+
+DEP_CPP_WMME_=\
+ "..\..\..\pjlib\include\pj\activesock.h"\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\math.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjmedia\config.h"\
+ "..\..\include\pjmedia\config_auto.h"\
+ "..\..\include\pjmedia\errno.h"\
+ "..\..\include\pjmedia\sound.h"\
+ "..\..\include\pjmedia\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjmedia_wince - Win32 (WCE ARMV4T) Debug"
+
+DEP_CPP_WMME_=\
+ "..\..\..\pjlib\include\pj\activesock.h"\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\math.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjmedia\config.h"\
+ "..\..\include\pjmedia\config_auto.h"\
+ "..\..\include\pjmedia\errno.h"\
+ "..\..\include\pjmedia\sound.h"\
+ "..\..\include\pjmedia\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjmedia_wince - Win32 (WCE x86) Release"
+
+DEP_CPP_WMME_=\
+ "..\..\..\pjlib\include\pj\activesock.h"\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\math.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjmedia\config.h"\
+ "..\..\include\pjmedia\config_auto.h"\
+ "..\..\include\pjmedia\errno.h"\
+ "..\..\include\pjmedia\sound.h"\
+ "..\..\include\pjmedia\types.h"\
+
+
+!ELSEIF "$(CFG)" == "pjmedia_wince - Win32 (WCE x86) Debug"
+
+DEP_CPP_WMME_=\
+ "..\..\..\pjlib\include\pj\activesock.h"\
+ "..\..\..\pjlib\include\pj\addr_resolv.h"\
+ "..\..\..\pjlib\include\pj\array.h"\
+ "..\..\..\pjlib\include\pj\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\assert.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_armcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_codew.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_gcce.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_msvc.h"\
+ "..\..\..\pjlib\include\pj\compat\cc_mwcc.h"\
+ "..\..\..\pjlib\include\pj\compat\ctype.h"\
+ "..\..\..\pjlib\include\pj\compat\errno.h"\
+ "..\..\..\pjlib\include\pj\compat\high_precision.h"\
+ "..\..\..\pjlib\include\pj\compat\m_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_auto.h"\
+ "..\..\..\pjlib\include\pj\compat\os_darwinos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux.h"\
+ "..\..\..\pjlib\include\pj\compat\os_linux_kernel.h"\
+ "..\..\..\pjlib\include\pj\compat\os_palmos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_rtems.h"\
+ "..\..\..\pjlib\include\pj\compat\os_sunos.h"\
+ "..\..\..\pjlib\include\pj\compat\os_symbian.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32.h"\
+ "..\..\..\pjlib\include\pj\compat\os_win32_wince.h"\
+ "..\..\..\pjlib\include\pj\compat\setjmp.h"\
+ "..\..\..\pjlib\include\pj\compat\size_t.h"\
+ "..\..\..\pjlib\include\pj\compat\stdarg.h"\
+ "..\..\..\pjlib\include\pj\compat\string.h"\
+ "..\..\..\pjlib\include\pj\config.h"\
+ "..\..\..\pjlib\include\pj\config_site.h"\
+ "..\..\..\pjlib\include\pj\config_site_sample.h"\
+ "..\..\..\pjlib\include\pj\ctype.h"\
+ "..\..\..\pjlib\include\pj\errno.h"\
+ "..\..\..\pjlib\include\pj\except.h"\
+ "..\..\..\pjlib\include\pj\fifobuf.h"\
+ "..\..\..\pjlib\include\pj\file_access.h"\
+ "..\..\..\pjlib\include\pj\file_io.h"\
+ "..\..\..\pjlib\include\pj\guid.h"\
+ "..\..\..\pjlib\include\pj\hash.h"\
+ "..\..\..\pjlib\include\pj\ioqueue.h"\
+ "..\..\..\pjlib\include\pj\ip_helper.h"\
+ "..\..\..\pjlib\include\pj\list.h"\
+ "..\..\..\pjlib\include\pj\list_i.h"\
+ "..\..\..\pjlib\include\pj\lock.h"\
+ "..\..\..\pjlib\include\pj\log.h"\
+ "..\..\..\pjlib\include\pj\math.h"\
+ "..\..\..\pjlib\include\pj\os.h"\
+ "..\..\..\pjlib\include\pj\pool.h"\
+ "..\..\..\pjlib\include\pj\pool_alt.h"\
+ "..\..\..\pjlib\include\pj\pool_buf.h"\
+ "..\..\..\pjlib\include\pj\pool_i.h"\
+ "..\..\..\pjlib\include\pj\rand.h"\
+ "..\..\..\pjlib\include\pj\rbtree.h"\
+ "..\..\..\pjlib\include\pj\sock.h"\
+ "..\..\..\pjlib\include\pj\sock_select.h"\
+ "..\..\..\pjlib\include\pj\string.h"\
+ "..\..\..\pjlib\include\pj\string_i.h"\
+ "..\..\..\pjlib\include\pj\timer.h"\
+ "..\..\..\pjlib\include\pj\types.h"\
+ "..\..\..\pjlib\include\pj\unicode.h"\
+ "..\..\..\pjlib\include\pjlib.h"\
+ "..\..\include\pjmedia\config.h"\
+ "..\..\include\pjmedia\config_auto.h"\
+ "..\..\include\pjmedia\errno.h"\
+ "..\..\include\pjmedia\sound.h"\
+ "..\..\include\pjmedia\types.h"\
+
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
SOURCE=..\..\src\pjmedia\wsola.c
!IF "$(CFG)" == "pjmedia_wince - Win32 (WCE emulator) Release"
diff --git a/pjmedia/include/pjmedia/config.h b/pjmedia/include/pjmedia/config.h
index 1ba0f040..70354ee7 100644
--- a/pjmedia/include/pjmedia/config.h
+++ b/pjmedia/include/pjmedia/config.h
@@ -56,11 +56,14 @@
/** Constant for Win32 DirectSound sound backend. */
#define PJMEDIA_SOUND_WIN32_DIRECT_SOUND 2
+/** Constant for Win32 MME sound backend. */
+#define PJMEDIA_SOUND_WIN32_MME_SOUND 3
+
/** When this is set, pjmedia will not provide any sound device backend.
* Application will have to provide its own sound device backend
* and link the application with it.
*/
-#define PJMEDIA_SOUND_EXTERNAL 3
+#define PJMEDIA_SOUND_EXTERNAL 255
/**
@@ -70,6 +73,7 @@
#ifndef PJMEDIA_SOUND_IMPLEMENTATION
# if defined(PJ_WIN32) && PJ_WIN32!=0
/*# define PJMEDIA_SOUND_IMPLEMENTATION PJMEDIA_SOUND_WIN32_DIRECT_SOUND*/
+/*# define PJMEDIA_SOUND_IMPLEMENTATION PJMEDIA_SOUND_WIN32_MME_SOUND*/
# define PJMEDIA_SOUND_IMPLEMENTATION PJMEDIA_SOUND_PORTAUDIO_SOUND
# else
# define PJMEDIA_SOUND_IMPLEMENTATION PJMEDIA_SOUND_PORTAUDIO_SOUND
diff --git a/pjmedia/src/pjmedia/wmme_sound.c b/pjmedia/src/pjmedia/wmme_sound.c
new file mode 100644
index 00000000..298a1b17
--- /dev/null
+++ b/pjmedia/src/pjmedia/wmme_sound.c
@@ -0,0 +1,1006 @@
+#include <pjmedia/sound.h>
+#include <pjmedia/errno.h>
+#include <pj/assert.h>
+#include <pj/log.h>
+#include <pj/os.h>
+#include <pj/string.h>
+
+#if PJMEDIA_SOUND_IMPLEMENTATION == PJMEDIA_SOUND_WIN32_MME_SOUND
+
+#ifdef _MSC_VER
+# pragma warning(push, 3)
+#endif
+
+#include <windows.h>
+#include <mmsystem.h>
+
+#ifdef _MSC_VER
+# pragma warning(pop)
+#endif
+
+#if defined(PJ_WIN32_WINCE) && PJ_WIN32_WINCE!=0
+# pragma comment(lib, "Coredll.lib")
+#elif defined(_MSC_VER)
+# pragma comment(lib, "winmm.lib")
+#endif
+
+
+#define THIS_FILE "wmme_sound.c"
+#define BITS_PER_SAMPLE 16
+#define BYTES_PER_SAMPLE (BITS_PER_SAMPLE/8)
+
+#define MAX_PACKET_BUFFER_COUNT 32
+#define MAX_HARDWARE 16
+
+struct wmme_dev_info
+{
+ pjmedia_snd_dev_info info;
+ unsigned deviceId;
+};
+
+static unsigned dev_count;
+static struct wmme_dev_info dev_info[MAX_HARDWARE];
+static int snd_init_count;
+
+/* Latency settings */
+static unsigned snd_input_latency = PJMEDIA_SND_DEFAULT_REC_LATENCY;
+static unsigned snd_output_latency = PJMEDIA_SND_DEFAULT_PLAY_LATENCY;
+
+
+/* Individual WMME capture/playback stream descriptor */
+struct wmme_stream
+{
+ union
+ {
+ HWAVEIN In;
+ HWAVEOUT Out;
+ } hWave;
+
+ WAVEHDR *WaveHdr;
+ HANDLE hEvent;
+ DWORD dwBufIdx;
+ DWORD dwMaxBufIdx;
+ pj_timestamp timestamp;
+};
+
+
+/* Sound stream. */
+struct pjmedia_snd_stream
+{
+ pjmedia_dir dir; /**< Sound direction. */
+ int play_id; /**< Playback dev id. */
+ int rec_id; /**< Recording dev id. */
+ pj_pool_t *pool; /**< Memory pool. */
+
+ pjmedia_snd_rec_cb rec_cb; /**< Capture callback. */
+ pjmedia_snd_play_cb play_cb; /**< Playback callback. */
+ void *user_data; /**< Application data. */
+
+ struct wmme_stream play_strm; /**< Playback stream. */
+ struct wmme_stream rec_strm; /**< Capture stream. */
+
+ void *buffer; /**< Temp. frame buffer. */
+ unsigned clock_rate; /**< Clock rate. */
+ unsigned samples_per_frame; /**< Samples per frame. */
+ unsigned bits_per_sample; /**< Bits per sample. */
+ unsigned channel_count; /**< Channel count. */
+
+ pj_thread_t *thread; /**< Thread handle. */
+ HANDLE thread_quit_event; /**< Quit signal to thread */
+};
+
+
+static pj_pool_factory *pool_factory;
+
+static void init_waveformatex (LPWAVEFORMATEX pcmwf,
+ unsigned clock_rate,
+ unsigned channel_count)
+{
+ pj_bzero(pcmwf, sizeof(PCMWAVEFORMAT));
+ pcmwf->wFormatTag = WAVE_FORMAT_PCM;
+ pcmwf->nChannels = (pj_uint16_t)channel_count;
+ pcmwf->nSamplesPerSec = clock_rate;
+ pcmwf->nBlockAlign = (pj_uint16_t)(channel_count * BYTES_PER_SAMPLE);
+ pcmwf->nAvgBytesPerSec = clock_rate * channel_count * BYTES_PER_SAMPLE;
+ pcmwf->wBitsPerSample = BITS_PER_SAMPLE;
+}
+
+
+/*
+ * Initialize WMME player device.
+ */
+static pj_status_t init_player_stream( pj_pool_t *pool,
+ struct wmme_stream *wmme_strm,
+ int dev_id,
+ unsigned clock_rate,
+ unsigned channel_count,
+ unsigned samples_per_frame,
+ unsigned buffer_count)
+{
+ MMRESULT mr;
+ WAVEFORMATEX pcmwf;
+ unsigned bytes_per_frame;
+ unsigned i;
+
+ PJ_ASSERT_RETURN(buffer_count <= MAX_PACKET_BUFFER_COUNT, PJ_EINVAL);
+
+ /* Check device ID */
+ if (dev_id == -1)
+ dev_id = 0;
+
+ PJ_ASSERT_RETURN(dev_id >= 0 && dev_id < (int)dev_count, PJ_EINVAL);
+
+ /*
+ * Create a wait event.
+ */
+ wmme_strm->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+ if (NULL == wmme_strm->hEvent)
+ return pj_get_os_error();
+
+ /*
+ * Set up wave format structure for opening the device.
+ */
+ init_waveformatex(&pcmwf, clock_rate, channel_count);
+ bytes_per_frame = samples_per_frame * BYTES_PER_SAMPLE;
+
+ /*
+ * Open wave device.
+ */
+ mr = waveOutOpen(&wmme_strm->hWave.Out, dev_info[dev_id].deviceId, &pcmwf,
+ (DWORD)wmme_strm->hEvent, 0, CALLBACK_EVENT);
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This is for HRESULT/GetLastError() */
+ PJ_RETURN_OS_ERROR(mr);
+
+ /* Pause the wave out device */
+ mr = waveOutPause(wmme_strm->hWave.Out);
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This is for HRESULT/GetLastError() */
+ PJ_RETURN_OS_ERROR(mr);
+
+ /*
+ * Create the buffers.
+ */
+ wmme_strm->WaveHdr = pj_pool_zalloc(pool, sizeof(WAVEHDR) * buffer_count);
+ for (i = 0; i < buffer_count; ++i)
+ {
+ wmme_strm->WaveHdr[i].lpData = pj_pool_zalloc(pool, bytes_per_frame);
+ wmme_strm->WaveHdr[i].dwBufferLength = bytes_per_frame;
+ mr = waveOutPrepareHeader(wmme_strm->hWave.Out,
+ &(wmme_strm->WaveHdr[i]),
+ sizeof(WAVEHDR));
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This is for HRESULT/GetLastError() */
+ PJ_RETURN_OS_ERROR(mr);
+ mr = waveOutWrite(wmme_strm->hWave.Out, &(wmme_strm->WaveHdr[i]),
+ sizeof(WAVEHDR));
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This is for HRESULT/GetLastError() */
+ PJ_RETURN_OS_ERROR(mr);
+ }
+
+ wmme_strm->dwBufIdx = 0;
+ wmme_strm->dwMaxBufIdx = buffer_count;
+ wmme_strm->timestamp.u64 = 0;
+
+ /* Done setting up play device. */
+ PJ_LOG(5, (THIS_FILE,
+ " WaveAPI Sound player \"%s\" initialized (clock_rate=%d, "
+ "channel_count=%d, samples_per_frame=%d (%dms))",
+ dev_info[dev_id].info.name,
+ clock_rate, channel_count, samples_per_frame,
+ samples_per_frame * 1000 / clock_rate));
+
+ return PJ_SUCCESS;
+}
+
+
+/*
+ * Initialize Windows Multimedia recorder device
+ */
+static pj_status_t init_capture_stream( pj_pool_t *pool,
+ struct wmme_stream *wmme_strm,
+ int dev_id,
+ unsigned clock_rate,
+ unsigned channel_count,
+ unsigned samples_per_frame,
+ unsigned buffer_count)
+{
+ MMRESULT mr;
+ WAVEFORMATEX pcmwf;
+ unsigned bytes_per_frame;
+ unsigned i;
+
+ PJ_ASSERT_RETURN(buffer_count <= MAX_PACKET_BUFFER_COUNT, PJ_EINVAL);
+
+ /* Check device ID */
+ if (dev_id == -1)
+ dev_id = 0;
+
+ PJ_ASSERT_RETURN(dev_id >= 0 && dev_id < (int)dev_count, PJ_EINVAL);
+
+ /*
+ * Create a wait event.
+ */
+ wmme_strm->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+ if (NULL == wmme_strm->hEvent)
+ return pj_get_os_error();
+
+ /*
+ * Set up wave format structure for opening the device.
+ */
+ init_waveformatex(&pcmwf, clock_rate, channel_count);
+ bytes_per_frame = samples_per_frame * BYTES_PER_SAMPLE;
+
+ /*
+ * Open wave device.
+ */
+ mr = waveInOpen(&wmme_strm->hWave.In, dev_info[dev_id].deviceId, &pcmwf,
+ (DWORD)wmme_strm->hEvent, 0, CALLBACK_EVENT);
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This is for HRESULT/GetLastError() */
+ PJ_RETURN_OS_ERROR(mr);
+
+ /*
+ * Create the buffers.
+ */
+ wmme_strm->WaveHdr = pj_pool_zalloc(pool, sizeof(WAVEHDR) * buffer_count);
+ for (i = 0; i < buffer_count; ++i)
+ {
+ wmme_strm->WaveHdr[i].lpData = pj_pool_zalloc(pool, bytes_per_frame);
+ wmme_strm->WaveHdr[i].dwBufferLength = bytes_per_frame;
+ mr = waveInPrepareHeader(wmme_strm->hWave.In, &(wmme_strm->WaveHdr[i]),
+ sizeof(WAVEHDR));
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This is for HRESULT/GetLastError() */
+ PJ_RETURN_OS_ERROR(mr);
+ mr = waveInAddBuffer(wmme_strm->hWave.In, &(wmme_strm->WaveHdr[i]),
+ sizeof(WAVEHDR));
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This is for HRESULT/GetLastError() */
+ PJ_RETURN_OS_ERROR(mr);
+ }
+
+ wmme_strm->dwBufIdx = 0;
+ wmme_strm->dwMaxBufIdx = buffer_count;
+ wmme_strm->timestamp.u64 = 0;
+
+ /* Done setting up play device. */
+ PJ_LOG(5,(THIS_FILE,
+ " WaveAPI Sound recorder \"%s\" initialized (clock_rate=%d, "
+ "channel_count=%d, samples_per_frame=%d (%dms))",
+ dev_info[dev_id].info.name,
+ clock_rate, channel_count, samples_per_frame,
+ samples_per_frame * 1000 / clock_rate));
+
+ return PJ_SUCCESS;
+}
+
+
+
+/*
+* WMME capture and playback thread.
+*/
+static int PJ_THREAD_FUNC wmme_dev_thread(void *arg)
+{
+ pjmedia_snd_stream *strm = arg;
+ HANDLE events[3];
+ unsigned eventCount;
+ unsigned bytes_per_frame;
+ pj_status_t status = PJ_SUCCESS;
+
+
+ eventCount = 0;
+ events[eventCount++] = strm->thread_quit_event;
+ if (strm->dir & PJMEDIA_DIR_PLAYBACK)
+ events[eventCount++] = strm->play_strm.hEvent;
+ if (strm->dir & PJMEDIA_DIR_CAPTURE)
+ events[eventCount++] = strm->rec_strm.hEvent;
+
+
+ /* Raise self priority. We don't want the audio to be distorted by
+ * system activity.
+ */
+#if defined(PJ_WIN32_WINCE) && PJ_WIN32_WINCE != 0
+ if (strm->dir & PJMEDIA_DIR_PLAYBACK)
+ CeSetThreadPriority(GetCurrentThread(), 153);
+ else
+ CeSetThreadPriority(GetCurrentThread(), 247);
+#else
+ SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
+#endif
+
+ /* Calculate bytes per frame */
+ bytes_per_frame = strm->samples_per_frame * BYTES_PER_SAMPLE;
+
+ /*
+ * Loop while not signalled to quit, wait for event objects to be
+ * signalled by WMME capture and play buffer.
+ */
+ while (status == PJ_SUCCESS)
+ {
+
+ DWORD rc;
+ pjmedia_dir signalled_dir;
+
+ rc = WaitForMultipleObjects(eventCount, events, FALSE, INFINITE);
+ if (rc < WAIT_OBJECT_0 || rc >= WAIT_OBJECT_0 + eventCount)
+ continue;
+
+ if (rc == WAIT_OBJECT_0)
+ break;
+
+ if (rc == (WAIT_OBJECT_0 + 1))
+ {
+ if (events[1] == strm->play_strm.hEvent)
+ signalled_dir = PJMEDIA_DIR_PLAYBACK;
+ else
+ signalled_dir = PJMEDIA_DIR_CAPTURE;
+ }
+ else
+ {
+ if (events[2] == strm->play_strm.hEvent)
+ signalled_dir = PJMEDIA_DIR_PLAYBACK;
+ else
+ signalled_dir = PJMEDIA_DIR_CAPTURE;
+ }
+
+
+ if (signalled_dir == PJMEDIA_DIR_PLAYBACK)
+ {
+ struct wmme_stream *wmme_strm = &strm->play_strm;
+ MMRESULT mr = MMSYSERR_NOERROR;
+ status = PJ_SUCCESS;
+
+ /*
+ * Windows Multimedia has requested us to feed some frames to
+ * playback buffer.
+ */
+
+ while (wmme_strm->WaveHdr[wmme_strm->dwBufIdx].dwFlags & WHDR_DONE)
+ {
+ void* buffer = wmme_strm->WaveHdr[wmme_strm->dwBufIdx].lpData;
+
+ PJ_LOG(5,(THIS_FILE, "Finished writing buffer %d",
+ wmme_strm->dwBufIdx));
+
+ /* Get frame from application. */
+ status = (*strm->play_cb)(strm->user_data,
+ wmme_strm->timestamp.u32.lo,
+ buffer,
+ bytes_per_frame);
+
+ if (status != PJ_SUCCESS)
+ break;
+
+ /* Write to the device. */
+ mr = waveOutWrite(wmme_strm->hWave.Out,
+ &(wmme_strm->WaveHdr[wmme_strm->dwBufIdx]),
+ sizeof(WAVEHDR));
+ if (mr != MMSYSERR_NOERROR)
+ {
+ status = PJ_STATUS_FROM_OS(mr);
+ break;
+ }
+
+ /* Increment position. */
+ if (++wmme_strm->dwBufIdx >= wmme_strm->dwMaxBufIdx)
+ wmme_strm->dwBufIdx = 0;
+ wmme_strm->timestamp.u64 += strm->samples_per_frame /
+ strm->channel_count;
+ }
+ }
+ else
+ {
+ struct wmme_stream *wmme_strm = &strm->rec_strm;
+ MMRESULT mr = MMSYSERR_NOERROR;
+ status = PJ_SUCCESS;
+
+ /*
+ * Windows Multimedia has indicated that it has some frames ready
+ * in the capture buffer. Get as much frames as possible to
+ * prevent overflows.
+ */
+#if 0
+ {
+ static DWORD tc = 0;
+ DWORD now = GetTickCount();
+ DWORD i = 0;
+ DWORD bits = 0;
+
+ if (tc == 0) tc = now;
+
+ for (i = 0; i < wmme_strm->dwMaxBufIdx; ++i)
+ {
+ bits = bits << 4;
+ bits |= wmme_strm->WaveHdr[i].dwFlags & WHDR_DONE;
+ }
+ PJ_LOG(5,(THIS_FILE, "Record Signal> Index: %d, Delta: %4.4d, "
+ "Flags: %6.6x\n",
+ wmme_strm->dwBufIdx,
+ now - tc,
+ bits));
+ tc = now;
+ }
+#endif
+
+ while (wmme_strm->WaveHdr[wmme_strm->dwBufIdx].dwFlags & WHDR_DONE)
+ {
+ char* buffer = (char*)
+ wmme_strm->WaveHdr[wmme_strm->dwBufIdx].lpData;
+ unsigned cap_len =
+ wmme_strm->WaveHdr[wmme_strm->dwBufIdx].dwBytesRecorded;
+
+ /*
+ PJ_LOG(5,(THIS_FILE, "Read %d bytes from buffer %d", cap_len,
+ wmme_strm->dwBufIdx));
+ */
+
+ if (cap_len < bytes_per_frame)
+ pj_bzero(buffer + cap_len, bytes_per_frame - cap_len);
+
+ /* Copy the audio data out of the wave buffer. */
+ pj_memcpy(strm->buffer, buffer, bytes_per_frame);
+
+ /* Re-add the buffer to the device. */
+ mr = waveInAddBuffer(wmme_strm->hWave.In,
+ &(wmme_strm->WaveHdr[wmme_strm->dwBufIdx]),
+ sizeof(WAVEHDR));
+ if (mr != MMSYSERR_NOERROR) {
+ status = PJ_STATUS_FROM_OS(mr);
+ break;
+ }
+
+ /* Call callback */
+ status = (*strm->rec_cb)(strm->user_data,
+ wmme_strm->timestamp.u32.lo,
+ strm->buffer,
+ bytes_per_frame);
+
+ if (status != PJ_SUCCESS)
+ break;
+
+ /* Increment position. */
+ if (++wmme_strm->dwBufIdx >= wmme_strm->dwMaxBufIdx)
+ wmme_strm->dwBufIdx = 0;
+ wmme_strm->timestamp.u64 += strm->samples_per_frame /
+ strm->channel_count;
+ }
+ }
+ }
+
+ PJ_LOG(5,(THIS_FILE, "WMME: thread stopping.."));
+ return 0;
+}
+
+
+/*
+* Init sound library.
+*/
+PJ_DEF(pj_status_t) pjmedia_snd_init(pj_pool_factory *factory)
+{
+ unsigned c;
+ int i;
+ int inputDeviceCount, outputDeviceCount, maximumPossibleDeviceCount;
+
+ if (++snd_init_count != 1)
+ return PJ_SUCCESS;
+
+ dev_count = 0;
+ pool_factory = factory;
+
+ /* Enumerate sound playback devices */
+ maximumPossibleDeviceCount = 0;
+
+ inputDeviceCount = waveInGetNumDevs();
+ if (inputDeviceCount > 0)
+ /* assume there is a WAVE_MAPPER */
+ maximumPossibleDeviceCount += inputDeviceCount + 1;
+
+ outputDeviceCount = waveOutGetNumDevs();
+ if (outputDeviceCount > 0)
+ /* assume there is a WAVE_MAPPER */
+ maximumPossibleDeviceCount += outputDeviceCount + 1;
+
+ if (maximumPossibleDeviceCount >= MAX_HARDWARE)
+ {
+ pj_assert(!"Too many hardware found");
+ PJ_LOG(3,(THIS_FILE, "Too many hardware found, "
+ "some devices will not be listed"));
+ }
+
+ if (inputDeviceCount > 0)
+ {
+ /* -1 is the WAVE_MAPPER */
+ for (i = -1; i < inputDeviceCount && dev_count < MAX_HARDWARE; ++i)
+ {
+ UINT uDeviceID = (UINT)((i==-1) ? WAVE_MAPPER : i);
+ WAVEINCAPS wic;
+ MMRESULT mr;
+
+ pj_bzero(&wic, sizeof(WAVEINCAPS));
+
+ mr = waveInGetDevCaps(uDeviceID, &wic, sizeof(WAVEINCAPS));
+
+ if (mr == MMSYSERR_NOMEM)
+ return PJ_ENOMEM;
+
+ if (mr != MMSYSERR_NOERROR)
+ continue;
+
+#ifdef UNICODE
+ WideCharToMultiByte(CP_ACP, 0, wic.szPname, wcslen(wic.szPname),
+ dev_info[dev_count].info.name, 64, NULL, NULL);
+#else
+ strncpy(dev_info[dev_count].info.name, wic.szPname, MAXPNAMELEN);
+#endif
+ if (uDeviceID == WAVE_MAPPER)
+ strcat(dev_info[dev_count].info.name, " - Input");
+
+ dev_info[dev_count].info.input_count = wic.wChannels;
+ dev_info[dev_count].info.output_count = 0;
+ dev_info[dev_count].info.default_samples_per_sec = 44100;
+ dev_info[dev_count].deviceId = uDeviceID;
+
+ /* Sometimes a device can return a rediculously large number of
+ * channels. This happened with an SBLive card on a Windows ME box.
+ * It also happens on Win XP!
+ */
+ if ((dev_info[dev_count].info.input_count < 1) ||
+ (dev_info[dev_count].info.input_count > 256))
+ dev_info[dev_count].info.input_count = 2;
+
+ ++dev_count;
+ }
+ }
+
+ if( outputDeviceCount > 0 )
+ {
+ /* -1 is the WAVE_MAPPER */
+ for (i = -1; i < outputDeviceCount && dev_count < MAX_HARDWARE; ++i)
+ {
+ UINT uDeviceID = (UINT)((i==-1) ? WAVE_MAPPER : i);
+ WAVEOUTCAPS woc;
+ MMRESULT mr;
+
+ pj_bzero(&woc, sizeof(WAVEOUTCAPS));
+
+ mr = waveOutGetDevCaps(uDeviceID, &woc, sizeof(WAVEOUTCAPS));
+
+ if (mr == MMSYSERR_NOMEM)
+ return PJ_ENOMEM;
+
+ if (mr != MMSYSERR_NOERROR)
+ continue;
+
+#ifdef UNICODE
+ WideCharToMultiByte(CP_ACP, 0, woc.szPname, wcslen(woc.szPname),
+ dev_info[dev_count].info.name, 64, NULL, NULL);
+#else
+ strncpy(dev_info[dev_count].info.name, woc.szPname, MAXPNAMELEN);
+#endif
+ if (uDeviceID == WAVE_MAPPER)
+ strcat(dev_info[dev_count].info.name, " - Output");
+
+ dev_info[dev_count].info.output_count = woc.wChannels;
+ dev_info[dev_count].info.input_count = 0;
+ dev_info[dev_count].deviceId = uDeviceID;
+ /* TODO: Perform a search! */
+ dev_info[dev_count].info.default_samples_per_sec = 44100;
+
+ /* Sometimes a device can return a rediculously large number of channels.
+ * This happened with an SBLive card on a Windows ME box.
+ * It also happens on Win XP!
+ */
+ if ((dev_info[dev_count].info.output_count < 1) ||
+ (dev_info[dev_count].info.output_count > 256))
+ dev_info[dev_count].info.output_count = 2;
+
+ ++dev_count;
+ }
+ }
+
+ PJ_LOG(4, (THIS_FILE, "WMME initialized, found %d devices:", dev_count));
+ for (c = 0; c < dev_count; ++c)
+ {
+ PJ_LOG(4, (THIS_FILE, " dev_id %d: %s (in=%d, out=%d)",
+ c,
+ dev_info[c].info.name,
+ dev_info[c].info.input_count,
+ dev_info[c].info.output_count));
+ }
+ return PJ_SUCCESS;
+}
+
+/*
+ * Deinitialize sound library.
+ */
+PJ_DEF(pj_status_t) pjmedia_snd_deinit(void)
+{
+ --snd_init_count;
+ return PJ_SUCCESS;
+}
+
+/*
+ * Get device count.
+ */
+PJ_DEF(int) pjmedia_snd_get_dev_count(void)
+{
+ return dev_count;
+}
+
+/*
+ * Get device info.
+ */
+PJ_DEF(const pjmedia_snd_dev_info*) pjmedia_snd_get_dev_info(unsigned index)
+{
+ if (index == (unsigned)-1)
+ index = 0;
+
+ PJ_ASSERT_RETURN(index < dev_count, NULL);
+
+ return &dev_info[index].info;
+}
+
+
+/*
+ * Open stream.
+ */
+static pj_status_t open_stream(pjmedia_dir dir,
+ int rec_id,
+ int play_id,
+ unsigned clock_rate,
+ unsigned channel_count,
+ unsigned samples_per_frame,
+ unsigned bits_per_sample,
+ pjmedia_snd_rec_cb rec_cb,
+ pjmedia_snd_play_cb play_cb,
+ void *user_data,
+ pjmedia_snd_stream **p_snd_strm)
+{
+ pj_pool_t *pool;
+ pjmedia_snd_stream *strm;
+ pj_status_t status;
+
+
+ /* Make sure sound subsystem has been initialized with
+ * pjmedia_snd_init()
+ */
+ PJ_ASSERT_RETURN(pool_factory != NULL, PJ_EINVALIDOP);
+
+
+ /* Can only support 16bits per sample */
+ PJ_ASSERT_RETURN(bits_per_sample == BITS_PER_SAMPLE, PJ_EINVAL);
+
+ /* Create and Initialize stream descriptor */
+ pool = pj_pool_create(pool_factory, "wmme-dev", 1000, 1000, NULL);
+ PJ_ASSERT_RETURN(pool != NULL, PJ_ENOMEM);
+
+ strm = pj_pool_zalloc(pool, sizeof(pjmedia_snd_stream));
+ strm->dir = dir;
+ strm->play_id = play_id;
+ strm->rec_id = rec_id;
+ strm->pool = pool;
+ strm->rec_cb = rec_cb;
+ strm->play_cb = play_cb;
+ strm->user_data = user_data;
+ strm->clock_rate = clock_rate;
+ strm->samples_per_frame = samples_per_frame;
+ strm->bits_per_sample = bits_per_sample;
+ strm->channel_count = channel_count;
+ strm->buffer = pj_pool_alloc(pool, samples_per_frame * BYTES_PER_SAMPLE);
+ if (!strm->buffer)
+ {
+ pj_pool_release(pool);
+ return PJ_ENOMEM;
+ }
+
+ /* Create player stream */
+ if (dir & PJMEDIA_DIR_PLAYBACK)
+ {
+ unsigned buf_count;
+
+ buf_count = snd_output_latency * clock_rate * channel_count /
+ samples_per_frame / 1000;
+
+ status = init_player_stream(strm->pool,
+ &strm->play_strm,
+ play_id,
+ clock_rate,
+ channel_count,
+ samples_per_frame,
+ buf_count);
+
+ if (status != PJ_SUCCESS)
+ {
+ pjmedia_snd_stream_close(strm);
+ return status;
+ }
+ }
+
+ /* Create capture stream */
+ if (dir & PJMEDIA_DIR_CAPTURE)
+ {
+ unsigned buf_count;
+
+ buf_count = snd_input_latency * clock_rate * channel_count /
+ samples_per_frame / 1000;
+
+ status = init_capture_stream(strm->pool,
+ &strm->rec_strm,
+ rec_id,
+ clock_rate,
+ channel_count,
+ samples_per_frame,
+ buf_count);
+
+ if (status != PJ_SUCCESS)
+ {
+ pjmedia_snd_stream_close(strm);
+ return status;
+ }
+ }
+
+ /* Create the stop event */
+ strm->thread_quit_event = CreateEvent(NULL, FALSE, FALSE, NULL);
+ if (strm->thread_quit_event == NULL)
+ return pj_get_os_error();
+
+ /* Create and start the thread */
+ status = pj_thread_create(pool, "wmme", &wmme_dev_thread, strm, 0, 0,
+ &strm->thread);
+ if (status != PJ_SUCCESS)
+ {
+ pjmedia_snd_stream_close(strm);
+ return status;
+ }
+
+ *p_snd_strm = strm;
+
+ return PJ_SUCCESS;
+}
+
+/*
+ * Open stream.
+ */
+PJ_DEF(pj_status_t) pjmedia_snd_open_rec(int index,
+ unsigned clock_rate,
+ unsigned channel_count,
+ unsigned samples_per_frame,
+ unsigned bits_per_sample,
+ pjmedia_snd_rec_cb rec_cb,
+ void *user_data,
+ pjmedia_snd_stream **p_snd_strm)
+{
+ PJ_ASSERT_RETURN(rec_cb && p_snd_strm, PJ_EINVAL);
+
+ return open_stream( PJMEDIA_DIR_CAPTURE,
+ index,
+ -1,
+ clock_rate,
+ channel_count,
+ samples_per_frame,
+ bits_per_sample,
+ rec_cb,
+ NULL,
+ user_data,
+ p_snd_strm);
+}
+
+PJ_DEF(pj_status_t) pjmedia_snd_open_player(int index,
+ unsigned clock_rate,
+ unsigned channel_count,
+ unsigned samples_per_frame,
+ unsigned bits_per_sample,
+ pjmedia_snd_play_cb play_cb,
+ void *user_data,
+ pjmedia_snd_stream **p_snd_strm)
+{
+ PJ_ASSERT_RETURN(play_cb && p_snd_strm, PJ_EINVAL);
+
+ return open_stream( PJMEDIA_DIR_PLAYBACK,
+ -1,
+ index,
+ clock_rate,
+ channel_count,
+ samples_per_frame,
+ bits_per_sample,
+ NULL,
+ play_cb,
+ user_data,
+ p_snd_strm);
+}
+
+/*
+ * Open both player and recorder.
+ */
+PJ_DEF(pj_status_t) pjmedia_snd_open(int rec_id,
+ int play_id,
+ unsigned clock_rate,
+ unsigned channel_count,
+ unsigned samples_per_frame,
+ unsigned bits_per_sample,
+ pjmedia_snd_rec_cb rec_cb,
+ pjmedia_snd_play_cb play_cb,
+ void *user_data,
+ pjmedia_snd_stream **p_snd_strm)
+{
+ PJ_ASSERT_RETURN(rec_cb && play_cb && p_snd_strm, PJ_EINVAL);
+
+ return open_stream( PJMEDIA_DIR_CAPTURE_PLAYBACK,
+ rec_id,
+ play_id,
+ clock_rate,
+ channel_count,
+ samples_per_frame,
+ bits_per_sample,
+ rec_cb,
+ play_cb,
+ user_data,
+ p_snd_strm);
+}
+
+/*
+ * Get stream info.
+ */
+PJ_DEF(pj_status_t) pjmedia_snd_stream_get_info(pjmedia_snd_stream *strm,
+ pjmedia_snd_stream_info *pi)
+{
+ PJ_ASSERT_RETURN(strm && pi, PJ_EINVAL);
+
+ pj_bzero(pi, sizeof(*pi));
+ pi->dir = strm->dir;
+ pi->play_id = strm->play_id;
+ pi->rec_id = strm->rec_id;
+ pi->clock_rate = strm->clock_rate;
+ pi->channel_count = strm->channel_count;
+ pi->samples_per_frame = strm->samples_per_frame;
+ pi->bits_per_sample = strm->bits_per_sample;
+ pi->rec_latency = snd_input_latency * strm->clock_rate *
+ strm->channel_count / 1000;
+ pi->play_latency = snd_output_latency * strm->clock_rate *
+ strm->channel_count / 1000;
+
+ return PJ_SUCCESS;
+}
+
+
+/*
+* Start stream.
+*/
+PJ_DEF(pj_status_t) pjmedia_snd_stream_start(pjmedia_snd_stream *stream)
+{
+ MMRESULT mr;
+
+ PJ_UNUSED_ARG(stream);
+
+ if (stream->play_strm.hWave.Out != NULL)
+ {
+ mr = waveOutRestart(stream->play_strm.hWave.Out);
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This macro is supposed to be used for HRESULT, fix. */
+ PJ_RETURN_OS_ERROR(mr);
+ PJ_LOG(5,(THIS_FILE, "WMME playback stream started"));
+ }
+
+ if (stream->rec_strm.hWave.In != NULL)
+ {
+ mr = waveInStart(stream->rec_strm.hWave.In);
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This macro is supposed to be used for HRESULT, fix. */
+ PJ_RETURN_OS_ERROR(mr);
+ PJ_LOG(5,(THIS_FILE, "WMME capture stream started"));
+ }
+
+ return PJ_SUCCESS;
+}
+
+/*
+ * Stop stream.
+ */
+PJ_DEF(pj_status_t) pjmedia_snd_stream_stop(pjmedia_snd_stream *stream)
+{
+ MMRESULT mr;
+
+ PJ_ASSERT_RETURN(stream != NULL, PJ_EINVAL);
+
+ if (stream->play_strm.hWave.Out != NULL)
+ {
+ mr = waveOutPause(stream->play_strm.hWave.Out);
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This macro is supposed to be used for HRESULT, fix. */
+ PJ_RETURN_OS_ERROR(mr);
+ PJ_LOG(5,(THIS_FILE, "Stopped WMME playback stream"));
+ }
+
+ if (stream->rec_strm.hWave.In != NULL)
+ {
+ mr = waveInStop(stream->rec_strm.hWave.In);
+ if (mr != MMSYSERR_NOERROR)
+ /* TODO: This macro is supposed to be used for HRESULT, fix. */
+ PJ_RETURN_OS_ERROR(mr);
+ PJ_LOG(5,(THIS_FILE, "Stopped WMME capture stream"));
+ }
+
+ return PJ_SUCCESS;
+}
+
+
+/*
+ * Destroy stream.
+ */
+PJ_DEF(pj_status_t) pjmedia_snd_stream_close(pjmedia_snd_stream *stream)
+{
+ unsigned i;
+
+ PJ_ASSERT_RETURN(stream != NULL, PJ_EINVAL);
+
+ pjmedia_snd_stream_stop(stream);
+
+ if (stream->thread)
+ {
+ SetEvent(stream->thread_quit_event);
+ pj_thread_join(stream->thread);
+ pj_thread_destroy(stream->thread);
+ stream->thread = NULL;
+ }
+
+ /* Unprepare the headers and close the play device */
+ if (stream->play_strm.hWave.Out)
+ {
+ waveOutReset(stream->play_strm.hWave.Out);
+ for (i = 0; i < stream->play_strm.dwMaxBufIdx; ++i)
+ waveOutUnprepareHeader(stream->play_strm.hWave.Out,
+ &(stream->play_strm.WaveHdr[i]),
+ sizeof(WAVEHDR));
+ waveOutClose(stream->play_strm.hWave.Out);
+ stream->play_strm.hWave.Out = NULL;
+ }
+
+ /* Close the play event */
+ if (stream->play_strm.hEvent)
+ {
+ CloseHandle(stream->play_strm.hEvent);
+ stream->play_strm.hEvent = NULL;
+ }
+
+ /* Unprepare the headers and close the record device */
+ if (stream->rec_strm.hWave.In)
+ {
+ waveInReset(stream->rec_strm.hWave.In);
+ for (i = 0; i < stream->play_strm.dwMaxBufIdx; ++i)
+ waveInUnprepareHeader(stream->rec_strm.hWave.In,
+ &(stream->rec_strm.WaveHdr[i]),
+ sizeof(WAVEHDR));
+ waveInClose(stream->rec_strm.hWave.In);
+ stream->rec_strm.hWave.In = NULL;
+ }
+
+ /* Close the record event */
+ if (stream->rec_strm.hEvent)
+ {
+ CloseHandle(stream->rec_strm.hEvent);
+ stream->rec_strm.hEvent = NULL;
+ }
+
+ pj_pool_release(stream->pool);
+
+ return PJ_SUCCESS;
+}
+
+/*
+ * Set sound latency.
+ */
+PJ_DEF(pj_status_t) pjmedia_snd_set_latency(unsigned input_latency,
+ unsigned output_latency)
+{
+ snd_input_latency = (input_latency == 0)?
+ PJMEDIA_SND_DEFAULT_REC_LATENCY : input_latency;
+ snd_output_latency = (output_latency == 0)?
+ PJMEDIA_SND_DEFAULT_PLAY_LATENCY : output_latency;
+
+ return PJ_SUCCESS;
+}
+
+#endif /* PJMEDIA_SOUND_IMPLEMENTATION */
+