diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2008-09-17 14:49:21 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2008-09-17 14:49:21 +0000 |
commit | 85e32856f0f9b30fe2366587c9d7180f2bbbcdd2 (patch) | |
tree | 26d364b80904966249587180c241a377b681657a /pjmedia | |
parent | 328ca512b0b590367073350ff094419617482f4b (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.dsp | 4 | ||||
-rw-r--r-- | pjmedia/build/pjmedia.vcproj | 4 | ||||
-rw-r--r-- | pjmedia/build/wince-evc4/pjmedia_wince.vcp | 827 | ||||
-rw-r--r-- | pjmedia/include/pjmedia/config.h | 6 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/wmme_sound.c | 1006 |
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 */ + |