$(RM) *.d
$(RM) parser.c
$(RM) lexer.c
- $(RM) ./lib/*
+ $(RM) -r ./lib/*
cleanall: clean
# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.14
+# Generated automatically using autoconf version 2.13
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
verbose=yes ;;
-version | --version | --versio | --versi | --vers)
- echo "configure generated by autoconf version 2.14"
+ echo "configure generated by autoconf version 2.13"
exit 0 ;;
-with-* | --with-*)
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char gethostbyname();
-char (*f)();
int main() {
#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
choke me
#else
-f = gethostbyname;
+gethostbyname();
#endif
; return 0; }
EOF
-if { (eval echo configure:7789: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7788: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_gethostbyname=yes"
else
if test $ac_cv_func_gethostbyname = no; then
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:7810: checking for gethostbyname in -lnsl" >&5
+echo "configure:7809: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7818 "configure"
+#line 7817 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
gethostbyname()
; return 0; }
EOF
-if { (eval echo configure:7829: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7828: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# -lsocket must be given before -lnsl if both are needed.
# We assume that if connect needs -lnsl, so does gethostbyname.
echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:7859: checking for connect" >&5
+echo "configure:7858: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7864 "configure"
+#line 7863 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char connect(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char connect();
-char (*f)();
int main() {
#if defined (__stub_connect) || defined (__stub___connect)
choke me
#else
-f = connect;
+connect();
#endif
; return 0; }
EOF
-if { (eval echo configure:7888: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7886: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_connect=yes"
else
if test $ac_cv_func_connect = no; then
echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:7909: checking for connect in -lsocket" >&5
+echo "configure:7907: checking for connect in -lsocket" >&5
ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 7917 "configure"
+#line 7915 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
connect()
; return 0; }
EOF
-if { (eval echo configure:7928: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7926: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:7952: checking for remove" >&5
+echo "configure:7950: checking for remove" >&5
if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7957 "configure"
+#line 7955 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char remove(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char remove();
-char (*f)();
int main() {
#if defined (__stub_remove) || defined (__stub___remove)
choke me
#else
-f = remove;
+remove();
#endif
; return 0; }
EOF
-if { (eval echo configure:7981: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7978: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_remove=yes"
else
if test $ac_cv_func_remove = no; then
echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:8002: checking for remove in -lposix" >&5
+echo "configure:7999: checking for remove in -lposix" >&5
ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lposix $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 8010 "configure"
+#line 8007 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
remove()
; return 0; }
EOF
-if { (eval echo configure:8021: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:8045: checking for shmat" >&5
+echo "configure:8042: checking for shmat" >&5
if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8050 "configure"
+#line 8047 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char shmat(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char shmat();
-char (*f)();
int main() {
#if defined (__stub_shmat) || defined (__stub___shmat)
choke me
#else
-f = shmat;
+shmat();
#endif
; return 0; }
EOF
-if { (eval echo configure:8074: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8070: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_shmat=yes"
else
if test $ac_cv_func_shmat = no; then
echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:8095: checking for shmat in -lipc" >&5
+echo "configure:8091: checking for shmat in -lipc" >&5
ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lipc $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 8103 "configure"
+#line 8099 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
shmat()
; return 0; }
EOF
-if { (eval echo configure:8114: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# libraries we check for below, so use a different variable.
# --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:8147: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:8143: checking for IceConnectionNumber in -lICE" >&5
ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lICE $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 8155 "configure"
+#line 8151 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
IceConnectionNumber()
; return 0; }
EOF
-if { (eval echo configure:8166: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8162: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
COMPILED_X_PROGRAM=0
echo $ac_n "checking for Motif/Lesstif headers""... $ac_c" 1>&6
-echo "configure:8204: checking for Motif/Lesstif headers" >&5
+echo "configure:8200: checking for Motif/Lesstif headers" >&5
ac_find_includes=
for ac_dir in $SEARCH_INCLUDE;
echo "$ac_t""found $ac_find_includes" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8219 "configure"
+#line 8215 "configure"
#include "confdefs.h"
#include <Xm/Xm.h>
; return 0; }
EOF
-if { (eval echo configure:8232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8228: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
echo "$ac_t""found in default search path" 1>&6
if test "$COMPILED_X_PROGRAM" = 0; then
echo $ac_n "checking for Motif/Lesstif library""... $ac_c" 1>&6
-echo "configure:8253: checking for Motif/Lesstif library" >&5
+echo "configure:8249: checking for Motif/Lesstif library" >&5
ac_find_libraries=
for ac_dir in $SEARCH_LIB;
echo "$ac_t""found at $ac_find_libraries" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8292 "configure"
+#line 8288 "configure"
#include "confdefs.h"
#include <Xm/Xm.h>
; return 0; }
EOF
-if { (eval echo configure:8305: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8301: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
echo "$ac_t""found in default search path" 1>&6
XPM_LINK=""
echo $ac_n "checking for Xpm library""... $ac_c" 1>&6
-echo "configure:8328: checking for Xpm library" >&5
+echo "configure:8324: checking for Xpm library" >&5
ac_find_libraries=
for ac_dir in $SEARCH_LIB;
echo "$ac_t""found at $ac_find_libraries" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8360 "configure"
+#line 8356 "configure"
#include "confdefs.h"
#include <X11/xpm.h>
; return 0; }
EOF
-if { (eval echo configure:8373: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8369: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
XPM_LINK="-lXpm "
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:8646: checking for $ac_hdr" >&5
+echo "configure:8642: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8651 "configure"
+#line 8647 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8656: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8652: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:8686: checking for $ac_hdr" >&5
+echo "configure:8682: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8691 "configure"
+#line 8687 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8696: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8692: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:8726: checking for $ac_hdr" >&5
+echo "configure:8722: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8731 "configure"
+#line 8727 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8736: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8732: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:8766: checking for $ac_hdr" >&5
+echo "configure:8762: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8771 "configure"
+#line 8767 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8776: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8772: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:8806: checking for $ac_hdr" >&5
+echo "configure:8802: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8811 "configure"
+#line 8807 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8816: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8812: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:8848: checking for $ac_hdr" >&5
+echo "configure:8844: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8853 "configure"
+#line 8849 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8858: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8854: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:8888: checking for ANSI C header files" >&5
+echo "configure:8884: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8893 "configure"
+#line 8889 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8901: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8897: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 8918 "configure"
+#line 8914 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 8936 "configure"
+#line 8932 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
:
else
cat > conftest.$ac_ext <<EOF
-#line 8957 "configure"
+#line 8953 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
exit (0); }
EOF
-if { (eval echo configure:8968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:8964: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
fi
echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:8992: checking for mode_t" >&5
+echo "configure:8988: checking for mode_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 8997 "configure"
+#line 8993 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
fi
echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:9025: checking for off_t" >&5
+echo "configure:9021: checking for off_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9030 "configure"
+#line 9026 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
fi
echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:9058: checking for pid_t" >&5
+echo "configure:9054: checking for pid_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9063 "configure"
+#line 9059 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
fi
echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:9091: checking for size_t" >&5
+echo "configure:9087: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9096 "configure"
+#line 9092 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
fi
echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:9124: checking for uid_t in sys/types.h" >&5
+echo "configure:9120: checking for uid_t in sys/types.h" >&5
if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9129 "configure"
+#line 9125 "configure"
#include "confdefs.h"
#include <sys/types.h>
EOF
echo $ac_n "checking for pw_gecos in struct passwd""... $ac_c" 1>&6
-echo "configure:9160: checking for pw_gecos in struct passwd" >&5
+echo "configure:9156: checking for pw_gecos in struct passwd" >&5
if eval "test \"`echo '$''{'wx_cv_struct_pw_gecos'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9166 "configure"
+#line 9162 "configure"
#include "confdefs.h"
#include <pwd.h>
int main() {
; return 0; }
EOF
-if { (eval echo configure:9177: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9173: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_struct_pw_gecos=yes
echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:9204: checking for working const" >&5
+echo "configure:9200: checking for working const" >&5
if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9209 "configure"
+#line 9205 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:9258: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9254: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_const=yes
else
fi
echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:9279: checking for inline" >&5
+echo "configure:9275: checking for inline" >&5
if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
cat > conftest.$ac_ext <<EOF
-#line 9286 "configure"
+#line 9282 "configure"
#include "confdefs.h"
int main() {
} $ac_kw foo() {
; return 0; }
EOF
-if { (eval echo configure:9293: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9289: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_inline=$ac_kw; break
else
echo $ac_n "checking size of char""... $ac_c" 1>&6
-echo "configure:9320: checking size of char" >&5
+echo "configure:9316: checking size of char" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_char'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_sizeof_char=1
else
cat > conftest.$ac_ext <<EOF
-#line 9328 "configure"
+#line 9324 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:9339: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:9335: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_char=`cat conftestval`
else
echo $ac_n "checking size of short""... $ac_c" 1>&6
-echo "configure:9359: checking size of short" >&5
+echo "configure:9355: checking size of short" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_sizeof_short=2
else
cat > conftest.$ac_ext <<EOF
-#line 9367 "configure"
+#line 9363 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:9378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:9374: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_short=`cat conftestval`
else
echo $ac_n "checking size of int *""... $ac_c" 1>&6
-echo "configure:9398: checking size of int *" >&5
+echo "configure:9394: checking size of int *" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_int_p'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_sizeof_int_p=4
else
cat > conftest.$ac_ext <<EOF
-#line 9406 "configure"
+#line 9402 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:9417: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:9413: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_int_p=`cat conftestval`
else
echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:9437: checking size of int" >&5
+echo "configure:9433: checking size of int" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_sizeof_int=4
else
cat > conftest.$ac_ext <<EOF
-#line 9445 "configure"
+#line 9441 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:9456: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:9452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_int=`cat conftestval`
else
echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:9476: checking size of long" >&5
+echo "configure:9472: checking size of long" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_sizeof_long=4
else
cat > conftest.$ac_ext <<EOF
-#line 9484 "configure"
+#line 9480 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:9495: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:9491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_long=`cat conftestval`
else
echo $ac_n "checking size of long long""... $ac_c" 1>&6
-echo "configure:9515: checking size of long long" >&5
+echo "configure:9511: checking size of long long" >&5
if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_sizeof_long_long=0
else
cat > conftest.$ac_ext <<EOF
-#line 9523 "configure"
+#line 9519 "configure"
#include "confdefs.h"
#include <stdio.h>
main()
exit(0);
}
EOF
-if { (eval echo configure:9534: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:9530: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_sizeof_long_long=`cat conftestval`
else
echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
-echo "configure:9555: checking whether byte ordering is bigendian" >&5
+echo "configure:9551: checking whether byte ordering is bigendian" >&5
if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_c_bigendian=unknown
# See if sys/param.h defines the BYTE_ORDER macro.
cat > conftest.$ac_ext <<EOF
-#line 9562 "configure"
+#line 9558 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/param.h>
#endif
; return 0; }
EOF
-if { (eval echo configure:9573: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9569: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
# It does; now see whether it defined to BIG_ENDIAN or not.
cat > conftest.$ac_ext <<EOF
-#line 9577 "configure"
+#line 9573 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/param.h>
#endif
; return 0; }
EOF
-if { (eval echo configure:9588: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9584: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_bigendian=yes
else
ac_cv_c_bigendian=unknown
else
cat > conftest.$ac_ext <<EOF
-#line 9608 "configure"
+#line 9604 "configure"
#include "confdefs.h"
main () {
/* Are we little or big endian? From Harbison&Steele. */
exit (u.c[sizeof (long) - 1] == 1);
}
EOF
-if { (eval echo configure:9621: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:9617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_c_bigendian=no
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:9668: checking for $ac_hdr" >&5
+echo "configure:9664: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9673 "configure"
+#line 9669 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9678: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9674: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo $ac_n "checking if C++ compiler supports bool""... $ac_c" 1>&6
-echo "configure:9726: checking if C++ compiler supports bool" >&5
+echo "configure:9722: checking if C++ compiler supports bool" >&5
if eval "test \"`echo '$''{'wx_cv_cpp_bool'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9741 "configure"
+#line 9737 "configure"
#include "confdefs.h"
; return 0; }
EOF
-if { (eval echo configure:9753: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9749: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
echo $ac_n "checking if you need GNU extensions""... $ac_c" 1>&6
-echo "configure:9795: checking if you need GNU extensions" >&5
+echo "configure:9791: checking if you need GNU extensions" >&5
if eval "test \"`echo '$''{'wx_cv_gnu_extensions'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9801 "configure"
+#line 9797 "configure"
#include "confdefs.h"
#include <features.h>
int main() {
; return 0; }
EOF
-if { (eval echo configure:9814: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9810: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_gnu_extensions=yes
else
echo $ac_n "checking for wcslen in -lc""... $ac_c" 1>&6
-echo "configure:9839: checking for wcslen in -lc" >&5
+echo "configure:9835: checking for wcslen in -lc" >&5
ac_lib_var=`echo c'_'wcslen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lc $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 9847 "configure"
+#line 9843 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
wcslen()
; return 0; }
EOF
-if { (eval echo configure:9858: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9854: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for wcslen in -lw""... $ac_c" 1>&6
-echo "configure:9884: checking for wcslen in -lw" >&5
+echo "configure:9880: checking for wcslen in -lw" >&5
ac_lib_var=`echo w'_'wcslen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lw $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 9892 "configure"
+#line 9888 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
wcslen()
; return 0; }
EOF
-if { (eval echo configure:9903: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9899: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for vprintf""... $ac_c" 1>&6
-echo "configure:9934: checking for vprintf" >&5
+echo "configure:9930: checking for vprintf" >&5
if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9939 "configure"
+#line 9935 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char vprintf(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char vprintf();
-char (*f)();
int main() {
#if defined (__stub_vprintf) || defined (__stub___vprintf)
choke me
#else
-f = vprintf;
+vprintf();
#endif
; return 0; }
EOF
-if { (eval echo configure:9963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_vprintf=yes"
else
if test "$ac_cv_func_vprintf" != yes; then
echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
-echo "configure:9987: checking for _doprnt" >&5
+echo "configure:9982: checking for _doprnt" >&5
if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 9992 "configure"
+#line 9987 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char _doprnt(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char _doprnt();
-char (*f)();
int main() {
#if defined (__stub__doprnt) || defined (__stub____doprnt)
choke me
#else
-f = _doprnt;
+_doprnt();
#endif
; return 0; }
EOF
-if { (eval echo configure:10016: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10010: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func__doprnt=yes"
else
for ac_func in vsnprintf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10044: checking for $ac_func" >&5
+echo "configure:10038: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10049 "configure"
+#line 10043 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:10073: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10066: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo $ac_n "checking for vsscanf""... $ac_c" 1>&6
-echo "configure:10113: checking for vsscanf" >&5
+echo "configure:10106: checking for vsscanf" >&5
if eval "test \"`echo '$''{'wx_cv_func_vsscanf'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
else
cat > conftest.$ac_ext <<EOF
-#line 10123 "configure"
+#line 10116 "configure"
#include "confdefs.h"
#ifdef __cplusplus
extern "C" void exit(int);
}
EOF
-if { (eval echo configure:10150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:10143: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
cat >> confdefs.h <<\EOF
for ac_func in vfork
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10186: checking for $ac_func" >&5
+echo "configure:10179: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10191 "configure"
+#line 10184 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:10215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10207: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
for ac_func in timegm
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10243: checking for $ac_func" >&5
+echo "configure:10235: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10248 "configure"
+#line 10240 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:10272: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10263: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
for ac_func in nanosleep
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10311: checking for $ac_func" >&5
+echo "configure:10302: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10316 "configure"
+#line 10307 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:10340: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10330: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for nanosleep in -lposix4""... $ac_c" 1>&6
-echo "configure:10365: checking for nanosleep in -lposix4" >&5
+echo "configure:10355: checking for nanosleep in -lposix4" >&5
ac_lib_var=`echo posix4'_'nanosleep | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lposix4 $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 10373 "configure"
+#line 10363 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
nanosleep()
; return 0; }
EOF
-if { (eval echo configure:10384: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10374: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
for ac_func in usleep
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10412: checking for $ac_func" >&5
+echo "configure:10402: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10417 "configure"
+#line 10407 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:10441: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10430: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
for ac_func in uname gethostname
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10480: checking for $ac_func" >&5
+echo "configure:10469: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10485 "configure"
+#line 10474 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:10509: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10497: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
for ac_func in strtok_r
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10537: checking for $ac_func" >&5
+echo "configure:10525: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10542 "configure"
+#line 10530 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:10566: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
for ac_func in inet_addr
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10595: checking for $ac_func" >&5
+echo "configure:10582: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10600 "configure"
+#line 10587 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:10624: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10610: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for inet_addr in -lnsl""... $ac_c" 1>&6
-echo "configure:10649: checking for inet_addr in -lnsl" >&5
+echo "configure:10635: checking for inet_addr in -lnsl" >&5
ac_lib_var=`echo nsl'_'inet_addr | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 10657 "configure"
+#line 10643 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
inet_addr()
; return 0; }
EOF
-if { (eval echo configure:10668: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10654: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for inet_addr in -lresolv""... $ac_c" 1>&6
-echo "configure:10687: checking for inet_addr in -lresolv" >&5
+echo "configure:10673: checking for inet_addr in -lresolv" >&5
ac_lib_var=`echo resolv'_'inet_addr | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lresolv $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 10695 "configure"
+#line 10681 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
inet_addr()
; return 0; }
EOF
-if { (eval echo configure:10706: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10692: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
for ac_func in inet_aton
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10739: checking for $ac_func" >&5
+echo "configure:10725: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 10744 "configure"
+#line 10730 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:10768: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10753: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for inet_aton in -l$INET_LINK""... $ac_c" 1>&6
-echo "configure:10793: checking for inet_aton in -l$INET_LINK" >&5
+echo "configure:10778: checking for inet_aton in -l$INET_LINK" >&5
ac_lib_var=`echo $INET_LINK'_'inet_aton | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-l$INET_LINK $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 10801 "configure"
+#line 10786 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
inet_aton()
; return 0; }
EOF
-if { (eval echo configure:10812: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10797: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$wxUSE_THREADS" = "yes" ; then
echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6
-echo "configure:10919: checking for pthread_create in -lpthread" >&5
+echo "configure:10904: checking for pthread_create in -lpthread" >&5
ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lpthread $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 10927 "configure"
+#line 10912 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
pthread_create()
; return 0; }
EOF
-if { (eval echo configure:10938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10923: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for pthread_create in -lc_r""... $ac_c" 1>&6
-echo "configure:10961: checking for pthread_create in -lc_r" >&5
+echo "configure:10946: checking for pthread_create in -lc_r" >&5
ac_lib_var=`echo c_r'_'pthread_create | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lc_r $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 10969 "configure"
+#line 10954 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
pthread_create()
; return 0; }
EOF
-if { (eval echo configure:10980: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10965: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
ac_safe=`echo "sys/prctl.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/prctl.h""... $ac_c" 1>&6
-echo "configure:11004: checking for sys/prctl.h" >&5
+echo "configure:10989: checking for sys/prctl.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11009 "configure"
+#line 10994 "configure"
#include "confdefs.h"
#include <sys/prctl.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11014: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:10999: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
for ac_func in thr_setconcurrency
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11054: checking for $ac_func" >&5
+echo "configure:11039: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11059 "configure"
+#line 11044 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:11083: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11067: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11113: checking for $ac_hdr" >&5
+echo "configure:11097: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11118 "configure"
+#line 11102 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11123: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11107: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
echo $ac_n "checking for sched_yield in -l$THREADS_LINK""... $ac_c" 1>&6
-echo "configure:11151: checking for sched_yield in -l$THREADS_LINK" >&5
+echo "configure:11135: checking for sched_yield in -l$THREADS_LINK" >&5
ac_lib_var=`echo $THREADS_LINK'_'sched_yield | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-l$THREADS_LINK $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 11159 "configure"
+#line 11143 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
sched_yield()
; return 0; }
EOF
-if { (eval echo configure:11170: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11154: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for sched_yield in -l"posix4"""... $ac_c" 1>&6
-echo "configure:11192: checking for sched_yield in -l"posix4"" >&5
+echo "configure:11176: checking for sched_yield in -l"posix4"" >&5
ac_lib_var=`echo "posix4"'_'sched_yield | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-l"posix4" $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 11200 "configure"
+#line 11184 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
sched_yield()
; return 0; }
EOF
-if { (eval echo configure:11211: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11195: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for pthread_attr_getschedpolicy in -l$THREADS_LINK""... $ac_c" 1>&6
-echo "configure:11241: checking for pthread_attr_getschedpolicy in -l$THREADS_LINK" >&5
+echo "configure:11225: checking for pthread_attr_getschedpolicy in -l$THREADS_LINK" >&5
ac_lib_var=`echo $THREADS_LINK'_'pthread_attr_getschedpolicy | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-l$THREADS_LINK $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 11249 "configure"
+#line 11233 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
pthread_attr_getschedpolicy()
; return 0; }
EOF
-if { (eval echo configure:11260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11244: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for pthread_attr_getschedpolicy in -l"posix4"""... $ac_c" 1>&6
-echo "configure:11282: checking for pthread_attr_getschedpolicy in -l"posix4"" >&5
+echo "configure:11266: checking for pthread_attr_getschedpolicy in -l"posix4"" >&5
ac_lib_var=`echo "posix4"'_'pthread_attr_getschedpolicy | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-l"posix4" $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 11290 "configure"
+#line 11274 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
pthread_attr_getschedpolicy()
; return 0; }
EOF
-if { (eval echo configure:11301: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11285: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for pthread_cancel in -l$THREADS_LINK""... $ac_c" 1>&6
-echo "configure:11331: checking for pthread_cancel in -l$THREADS_LINK" >&5
+echo "configure:11315: checking for pthread_cancel in -l$THREADS_LINK" >&5
ac_lib_var=`echo $THREADS_LINK'_'pthread_cancel | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-l$THREADS_LINK $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 11339 "configure"
+#line 11323 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
pthread_cancel()
; return 0; }
EOF
-if { (eval echo configure:11350: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11334: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for pthread_cleanup_push/pop""... $ac_c" 1>&6
-echo "configure:11376: checking for pthread_cleanup_push/pop" >&5
+echo "configure:11360: checking for pthread_cleanup_push/pop" >&5
if eval "test \"`echo '$''{'wx_cv_func_pthread_cleanup_push'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11382 "configure"
+#line 11366 "configure"
#include "confdefs.h"
#include <pthread.h>
int main() {
; return 0; }
EOF
-if { (eval echo configure:11392: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11376: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_func_pthread_cleanup_push=yes
else
if test "$ac_cv_func_strtok_r" = "yes"; then
echo $ac_n "checking if -D_REENTRANT is needed""... $ac_c" 1>&6
-echo "configure:11433: checking if -D_REENTRANT is needed" >&5
+echo "configure:11417: checking if -D_REENTRANT is needed" >&5
if test "$NEEDS_D_REENTRANT_FOR_R_FUNCS" = 1; then
CFLAGS="${CFLAGS} -D_REENTRANT"
CXXFLAGS="${CXXFLAGS} -D_REENTRANT"
ZLIB_LINK=
ac_safe=`echo "zlib.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for zlib.h""... $ac_c" 1>&6
-echo "configure:11564: checking for zlib.h" >&5
+echo "configure:11548: checking for zlib.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11569 "configure"
+#line 11553 "configure"
#include "confdefs.h"
#include <zlib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11574: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11558: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
echo "$ac_t""yes" 1>&6
echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6
-echo "configure:11591: checking for deflate in -lz" >&5
+echo "configure:11575: checking for deflate in -lz" >&5
ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lz $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 11599 "configure"
+#line 11583 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
deflate()
; return 0; }
EOF
-if { (eval echo configure:11610: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11594: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
PNG_LINK=
ac_safe=`echo "png.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for png.h""... $ac_c" 1>&6
-echo "configure:11657: checking for png.h" >&5
+echo "configure:11641: checking for png.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11662 "configure"
+#line 11646 "configure"
#include "confdefs.h"
#include <png.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11667: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11651: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
echo "$ac_t""yes" 1>&6
echo $ac_n "checking for png_check_sig in -lpng""... $ac_c" 1>&6
-echo "configure:11684: checking for png_check_sig in -lpng" >&5
+echo "configure:11668: checking for png_check_sig in -lpng" >&5
ac_lib_var=`echo png'_'png_check_sig | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lpng -lz -lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 11692 "configure"
+#line 11676 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
png_check_sig()
; return 0; }
EOF
-if { (eval echo configure:11703: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
JPEG_LINK=
ac_safe=`echo "jpeglib.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for jpeglib.h""... $ac_c" 1>&6
-echo "configure:11748: checking for jpeglib.h" >&5
+echo "configure:11732: checking for jpeglib.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11753 "configure"
+#line 11737 "configure"
#include "confdefs.h"
#include <jpeglib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11758: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11742: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
echo "$ac_t""yes" 1>&6
echo $ac_n "checking for jpeg_read_header in -ljpeg""... $ac_c" 1>&6
-echo "configure:11775: checking for jpeg_read_header in -ljpeg" >&5
+echo "configure:11759: checking for jpeg_read_header in -ljpeg" >&5
ac_lib_var=`echo jpeg'_'jpeg_read_header | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-ljpeg $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 11783 "configure"
+#line 11767 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
jpeg_read_header()
; return 0; }
EOF
-if { (eval echo configure:11794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11778: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$wxUSE_OPENGL" = "yes"; then
ac_safe=`echo "GL/gl.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for GL/gl.h""... $ac_c" 1>&6
-echo "configure:11836: checking for GL/gl.h" >&5
+echo "configure:11820: checking for GL/gl.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 11841 "configure"
+#line 11825 "configure"
#include "confdefs.h"
#include <GL/gl.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11846: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11830: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
EOF
echo $ac_n "checking for glFlush in -lGL""... $ac_c" 1>&6
-echo "configure:11872: checking for glFlush in -lGL" >&5
+echo "configure:11856: checking for glFlush in -lGL" >&5
ac_lib_var=`echo GL'_'glFlush | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lGL $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 11880 "configure"
+#line 11864 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
glFlush()
; return 0; }
EOF
-if { (eval echo configure:11891: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11875: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for glFlush in -lMesaGL""... $ac_c" 1>&6
-echo "configure:11913: checking for glFlush in -lMesaGL" >&5
+echo "configure:11897: checking for glFlush in -lMesaGL" >&5
ac_lib_var=`echo MesaGL'_'glFlush | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lMesaGL $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 11921 "configure"
+#line 11905 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
glFlush()
; return 0; }
EOF
-if { (eval echo configure:11932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11916: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
for ac_func in strptime
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12127: checking for $ac_func" >&5
+echo "configure:12111: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12132 "configure"
+#line 12116 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:12156: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12139: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo $ac_n "checking for timezone variable in <time.h>""... $ac_c" 1>&6
-echo "configure:12182: checking for timezone variable in <time.h>" >&5
+echo "configure:12165: checking for timezone variable in <time.h>" >&5
if eval "test \"`echo '$''{'wx_cv_var_timezone'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12188 "configure"
+#line 12171 "configure"
#include "confdefs.h"
#include <time.h>
; return 0; }
EOF
-if { (eval echo configure:12200: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12183: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_var_timezone=__timezone
rm -rf conftest*
cat > conftest.$ac_ext <<EOF
-#line 12211 "configure"
+#line 12194 "configure"
#include "confdefs.h"
#include <time.h>
; return 0; }
EOF
-if { (eval echo configure:12223: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12206: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_var_timezone=_timezone
rm -rf conftest*
cat > conftest.$ac_ext <<EOF
-#line 12234 "configure"
+#line 12217 "configure"
#include "confdefs.h"
#include <time.h>
; return 0; }
EOF
-if { (eval echo configure:12246: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12229: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_var_timezone=timezone
for ac_func in localtime
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12281: checking for $ac_func" >&5
+echo "configure:12264: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12286 "configure"
+#line 12269 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:12310: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12292: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
if test "$ac_cv_func_localtime" = "yes"; then
echo $ac_n "checking for tm_gmtoff in struct tm""... $ac_c" 1>&6
-echo "configure:12337: checking for tm_gmtoff in struct tm" >&5
+echo "configure:12319: checking for tm_gmtoff in struct tm" >&5
if eval "test \"`echo '$''{'wx_cv_struct_tm_has_gmtoff'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12343 "configure"
+#line 12325 "configure"
#include "confdefs.h"
#include <time.h>
; return 0; }
EOF
-if { (eval echo configure:12355: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12337: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_struct_tm_has_gmtoff=yes
for ac_func in gettimeofday ftime
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12381: checking for $ac_func" >&5
+echo "configure:12363: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12386 "configure"
+#line 12368 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:12410: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12391: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
if test "$ac_cv_func_gettimeofday" = "yes"; then
echo $ac_n "checking whether gettimeofday takes two arguments""... $ac_c" 1>&6
-echo "configure:12437: checking whether gettimeofday takes two arguments" >&5
+echo "configure:12418: checking whether gettimeofday takes two arguments" >&5
if eval "test \"`echo '$''{'wx_cv_func_gettimeofday_has_2_args'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12452 "configure"
+#line 12433 "configure"
#include "confdefs.h"
#include <sys/time.h>
; return 0; }
EOF
-if { (eval echo configure:12466: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12447: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_func_gettimeofday_has_2_args=yes
else
cat conftest.$ac_ext >&5
rm -rf conftest*
cat > conftest.$ac_ext <<EOF
-#line 12474 "configure"
+#line 12455 "configure"
#include "confdefs.h"
#include <sys/time.h>
; return 0; }
EOF
-if { (eval echo configure:12487: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12468: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_func_gettimeofday_has_2_args=no
else
if test "$wxUSE_SOCKETS" = "yes"; then
echo $ac_n "checking for socket""... $ac_c" 1>&6
-echo "configure:12533: checking for socket" >&5
+echo "configure:12514: checking for socket" >&5
if eval "test \"`echo '$''{'ac_cv_func_socket'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12538 "configure"
+#line 12519 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char socket(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char socket();
-char (*f)();
int main() {
#if defined (__stub_socket) || defined (__stub___socket)
choke me
#else
-f = socket;
+socket();
#endif
; return 0; }
EOF
-if { (eval echo configure:12562: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12542: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_socket=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6
-echo "configure:12580: checking for socket in -lsocket" >&5
+echo "configure:12560: checking for socket in -lsocket" >&5
ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lsocket $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 12588 "configure"
+#line 12568 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
socket()
; return 0; }
EOF
-if { (eval echo configure:12599: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12579: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
if test "$wxUSE_SOCKETS" = "yes" ; then
echo $ac_n "checking what is the type of the third argument of getsockname""... $ac_c" 1>&6
-echo "configure:12633: checking what is the type of the third argument of getsockname" >&5
+echo "configure:12613: checking what is the type of the third argument of getsockname" >&5
if eval "test \"`echo '$''{'wx_cv_type_getsockname3'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12648 "configure"
+#line 12628 "configure"
#include "confdefs.h"
#include <sys/types.h>
; return 0; }
EOF
-if { (eval echo configure:12661: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12641: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_type_getsockname3=socklen_t
else
cat conftest.$ac_ext >&5
rm -rf conftest*
cat > conftest.$ac_ext <<EOF
-#line 12669 "configure"
+#line 12649 "configure"
#include "confdefs.h"
#include <sys/types.h>
; return 0; }
EOF
-if { (eval echo configure:12682: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12662: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_type_getsockname3=size_t
else
cat conftest.$ac_ext >&5
rm -rf conftest*
cat > conftest.$ac_ext <<EOF
-#line 12690 "configure"
+#line 12670 "configure"
#include "confdefs.h"
#include <sys/types.h>
; return 0; }
EOF
-if { (eval echo configure:12703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12683: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wx_cv_type_getsockname3=int
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:12761: checking for $ac_hdr" >&5
+echo "configure:12741: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12766 "configure"
+#line 12746 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12771: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12751: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
for ac_func in dlopen
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12822: checking for $ac_func" >&5
+echo "configure:12802: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12827 "configure"
+#line 12807 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:12851: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12830: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:12879: checking for dlopen in -ldl" >&5
+echo "configure:12858: checking for dlopen in -ldl" >&5
ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-ldl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 12887 "configure"
+#line 12866 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
dlopen()
; return 0; }
EOF
-if { (eval echo configure:12898: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12877: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
for ac_func in shl_load
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:12927: checking for $ac_func" >&5
+echo "configure:12906: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 12932 "configure"
+#line 12911 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
-char (*f)();
int main() {
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
-f = $ac_func;
+$ac_func();
#endif
; return 0; }
EOF
-if { (eval echo configure:12956: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12934: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:13187: checking for $ac_hdr" >&5
+echo "configure:13165: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 13192 "configure"
+#line 13170 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13197: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13175: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
LD_LIBS="\${top_builddir}/lib/${WX_LIBRARY_NAME_STATIC} $EXTRA_LIBS"
-INCLUDES="-I. -I\${top_builddir}/include -I\${top_srcdir}/include $ZLIB_INCLUDE $PNG_INCLUDE $JPEG_INCLUDE $TIFF_INCLUDE $TOOLKIT_INCLUDE"
+INCLUDES="-I. -I\${top_builddir}/include -I\${top_srcdir}/include -I\${top_srcdir}/contrib/include $ZLIB_INCLUDE $PNG_INCLUDE $JPEG_INCLUDE $TIFF_INCLUDE $TOOLKIT_INCLUDE"
if test "$GXX" = yes ; then
CXXWARNINGS="-Wall"
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:13730: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:13708: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
if test "$wxUSE_GUI" = "yes"; then
wx_cv_path_samplesubdirs=$SAMPLES_SUBDIRS
- subdirs="demos samples utils"
+ wx_cv_path_ifs=$PATH_IFS
+ wx_cv_program_ext=$PROGRAM_EXT
+ wx_cv_target_library=$WX_TARGET_LIBRARY
+ subdirs="demos samples utils contrib"
fi
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
- echo "$CONFIG_STATUS generated by autoconf version 2.14"
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
exit 0 ;;
-help | --help | --hel | --he | --h)
echo "\$ac_cs_usage"; exit 0 ;;
esac
done
- for ac_config_dir in demos samples utils; do
+ for ac_config_dir in demos samples utils contrib; do
# Do not complain, so a configure script can configure whichever
# parts of a large source tree are present.
LD_LIBS="\${top_builddir}/lib/${WX_LIBRARY_NAME_STATIC} $EXTRA_LIBS"
dnl all -I options we must pass to the compiler
-INCLUDES="-I. -I\${top_builddir}/include -I\${top_srcdir}/include $ZLIB_INCLUDE $PNG_INCLUDE $JPEG_INCLUDE $TIFF_INCLUDE $TOOLKIT_INCLUDE"
+INCLUDES="-I. -I\${top_builddir}/include -I\${top_srcdir}/include -I\${top_srcdir}/contrib/include $ZLIB_INCLUDE $PNG_INCLUDE $JPEG_INCLUDE $TIFF_INCLUDE $TOOLKIT_INCLUDE"
dnl C/C++ compiler options used to compile wxWindows
if test "$GXX" = yes ; then
dnl some more GUI only things
if test "$wxUSE_GUI" = "yes"; then
- dnl we need to pass SAMPLES_SUBDIRS to the configure in
+ dnl we need to pass SAMPLES_SUBDIRS (and some other) to the configure in
dnl samples and the only way to do it is, again, use the cache
wx_cv_path_samplesubdirs=$SAMPLES_SUBDIRS
- AC_CONFIG_SUBDIRS(demos samples utils)
+ wx_cv_path_ifs=$PATH_IFS
+ wx_cv_program_ext=$PROGRAM_EXT
+ wx_cv_target_library=$WX_TARGET_LIBRARY
+ AC_CONFIG_SUBDIRS(demos samples utils contrib)
fi
dnl from wxUSE_GUI
--- /dev/null
+#
+# Makefile : Builds wxWindows utils for Unix.
+#
+
+all:
+ cd src; make
+
+clean:
+ cd src; make clean
+ cd samples; make clean
+
+samples:
+ cd samples; make
--- /dev/null
+#! /bin/sh
+
+# From configure.in Id
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=Makefile.in
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+ESD_LINK=
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:531: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 546 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:552: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 563 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:569: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 580 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:586: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+ac_safe=`echo "esd.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for esd.h""... $ac_c" 1>&6
+echo "configure:612: checking for esd.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 617 "configure"
+#include "confdefs.h"
+#include <esd.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:622: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+
+ echo $ac_n "checking for esd_close in -lesd""... $ac_c" 1>&6
+echo "configure:640: checking for esd_close in -lesd" >&5
+ac_lib_var=`echo esd'_'esd_close | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lesd $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 648 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char esd_close();
+
+int main() {
+esd_close()
+; return 0; }
+EOF
+if { (eval echo configure:659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+
+ ESD_LINK="-lesd"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+if test ! -z $ESD_LINK; then
+ echo "ESound detected"
+fi
+
+
+PATH_IFS=$wx_cv_path_ifs
+WX_TARGET_LIBRARY=$wx_cv_target_library
+
+
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "
+ Makefile
+ src/Makefile
+ src/ogl/Makefile
+ src/mmedia/Makefile
+ samples/Makefile
+ samples/mmedia/Makefile
+ " | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CPP@%$CPP%g
+s%@PATH_IFS@%$PATH_IFS%g
+s%@ESD_LINK@%$ESD_LINK%g
+s%@WX_TARGET_LIBRARY@%$WX_TARGET_LIBRARY%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile
+ src/Makefile
+ src/ogl/Makefile
+ src/mmedia/Makefile
+ samples/Makefile
+ samples/mmedia/Makefile
+ "}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
--- /dev/null
+dnl Process this file with autoconf to produce a configure script.
+AC_REVISION($Id$)dnl
+
+AC_INIT(Makefile.in)
+
+dnl ---------------
+dnl MMedia specific
+dnl ---------------
+
+dnl Check for ESD
+
+ESD_LINK=
+AC_CHECK_HEADER(esd.h, [
+ AC_CHECK_LIB(esd, esd_close, [
+ ESD_LINK="-lesd"
+ ])
+])
+
+if test ! -z $ESD_LINK; then
+ echo "ESound detected"
+fi
+
+dnl -----------
+dnl Final subst
+
+PATH_IFS=$wx_cv_path_ifs
+WX_TARGET_LIBRARY=$wx_cv_target_library
+
+AC_SUBST(PATH_IFS)
+AC_SUBST(ESD_LINK)
+AC_SUBST(WX_TARGET_LIBRARY)
+
+dnl -----------
+dnl File output
+
+
+AC_OUTPUT([
+ Makefile
+ src/Makefile
+ src/ogl/Makefile
+ src/mmedia/Makefile
+ samples/Makefile
+ samples/mmedia/Makefile
+ ])
--- /dev/null
+\chapter{Bugs}\label{bugs}%
+\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}
+
+These are the known bugs.
+
+\begin{itemize}\itemsep=0pt
+\item In the OGLEdit sample, .dia files are output double-spaced
+due to an unidentified bug in the way a stream is converted to a file.
+\end{itemize}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/cdbase.h at 26/Feb/00 14:52:12
+%
+
+
+\section{\class{wxCDAudio}}\label{wxcdaudio}
+
+\wxheading{Derived from}
+
+\helpref{wxObject}{wxobject}
+
+\wxheading{Data structures}
+
+{\small \begin{verbatim}
+typedef struct wxCDtime {
+ wxUint8 track
+\end{verbatim}}
+{\small \begin{verbatim}
+typedef enum { PLAYING, PAUSED, STOPPED } CDstatus
+\end{verbatim}}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/cdunix.h at 26/Feb/00 14:52:10
+%
+
+
+\section{\class{wxCDAudioLinux}}\label{wxcdaudiolinux}
+
+
+
+\wxheading{Derived from}
+
+\helpref{wxCDAudio}{wxcdaudio}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxCDAudioLinux::wxCDAudioLinux}\label{wxcdaudiolinuxwxcdaudiolinux}
+
+\func{}{wxCDAudioLinux}{\void}
+
+
+\membersection{wxCDAudioLinux::wxCDAudioLinux}\label{wxcdaudiolinuxwxcdaudiolinux}
+
+\func{}{wxCDAudioLinux}{\param{const char* }{dev\_name}}
+
+
+\membersection{wxCDAudioLinux::\destruct{wxCDAudioLinux}}\label{wxcdaudiolinuxdtor}
+
+\func{}{\destruct{wxCDAudioLinux}}{\void}
+
+
+\membersection{wxCDAudioLinux::Play}\label{wxcdaudiolinuxplay}
+
+\func{bool}{Play}{\param{const wxCDtime\& }{beg\_time}, \param{const wxCDtime\& }{end\_time}}
+
+
+\membersection{wxCDAudioLinux::Pause}\label{wxcdaudiolinuxpause}
+
+\func{bool}{Pause}{\void}
+
+
+\membersection{wxCDAudioLinux::Resume}\label{wxcdaudiolinuxresume}
+
+\func{bool}{Resume}{\void}
+
+
+\membersection{wxCDAudioLinux::GetStatus}\label{wxcdaudiolinuxgetstatus}
+
+\func{CDstatus}{GetStatus}{\void}
+
+
+\membersection{wxCDAudioLinux::GetTime}\label{wxcdaudiolinuxgettime}
+
+\func{wxCDtime}{GetTime}{\void}
+
+
+\membersection{wxCDAudioLinux::GetToc}\label{wxcdaudiolinuxgettoc}
+
+\func{CDtoc\&}{GetToc}{\void}
+
+
+\membersection{wxCDAudioLinux::Ok}\label{wxcdaudiolinuxok}
+
+\constfunc{bool}{Ok}{\void}
+
+
+\membersection{wxCDAudioLinux::OpenDevice}\label{wxcdaudiolinuxopendevice}
+
+\func{void}{OpenDevice}{\param{const char* }{dev\_name}}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/cdwin.h at 26/Feb/00 14:52:15
+%
+
+
+\section{\class{wxCDAudioWin}}\label{wxcdaudiowin}
+
+
+
+\wxheading{Derived from}
+
+\helpref{wxCDAudio}{wxcdaudio}
+
+\wxheading{Data structures}
+
+{\small \begin{verbatim}
+typedef struct CDAW\_Internal {
+ MCIDEVICEID dev\_id
+\end{verbatim}}
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxCDAudioWin::wxCDAudioWin}\label{wxcdaudiowinwxcdaudiowin}
+
+\func{}{wxCDAudioWin}{\void}
+
+
+\membersection{wxCDAudioWin::wxCDAudioWin}\label{wxcdaudiowinwxcdaudiowin}
+
+\func{}{wxCDAudioWin}{\param{const char* }{dev\_name}}
+
+
+\membersection{wxCDAudioWin::\destruct{wxCDAudioWin}}\label{wxcdaudiowindtor}
+
+\func{}{\destruct{wxCDAudioWin}}{\void}
+
+
+\membersection{wxCDAudioWin::Play}\label{wxcdaudiowinplay}
+
+\func{bool}{Play}{\param{const wxCDtime\& }{beg\_time}, \param{const wxCDtime\& }{end\_time}}
+
+
+\membersection{wxCDAudioWin::Pause}\label{wxcdaudiowinpause}
+
+\func{bool}{Pause}{\void}
+
+
+\membersection{wxCDAudioWin::Resume}\label{wxcdaudiowinresume}
+
+\func{bool}{Resume}{\void}
+
+
+\membersection{wxCDAudioWin::GetStatus}\label{wxcdaudiowingetstatus}
+
+\func{CDstatus}{GetStatus}{\void}
+
+
+\membersection{wxCDAudioWin::GetTime}\label{wxcdaudiowingettime}
+
+\func{wxCDtime}{GetTime}{\void}
+
+
+\membersection{wxCDAudioWin::GetToc}\label{wxcdaudiowingettoc}
+
+\func{const CDtoc\&}{GetToc}{\void}
+
+
+\membersection{wxCDAudioWin::Ok}\label{wxcdaudiowinok}
+
+\constfunc{bool}{Ok}{\void}
+
+
+\membersection{wxCDAudioWin::PrepareToc}\label{wxcdaudiowinpreparetoc}
+
+\func{void}{PrepareToc}{\void}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/cdbase.h at 26/Feb/00 14:52:12
+%
+
+
+\section{\class{CDtoc}}\label{cdtoc}
+
+
+Table of contents manager
+
+\wxheading{Derived from}
+
+No base class
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{CDtoc::CDtoc}\label{cdtoccdtoc}
+
+\func{}{CDtoc}{\param{wxCDtime\& }{tot\_tm}, \param{wxCDtime* }{trks\_tm}, \param{wxCDtime* }{trks\_pos}}
+
+
+\membersection{CDtoc::GetTrackTime}\label{cdtocgettracktime}
+
+\constfunc{wxCDtime}{GetTrackTime}{\param{wxUint8 }{track}}
+
+Returns the length of the specified track
+track: track to get length
+
+
+\membersection{CDtoc::GetTrackPos}\label{cdtocgettrackpos}
+
+\constfunc{wxCDtime}{GetTrackPos}{\param{wxUint8 }{track}}
+
+Returns the position of the specified track
+track: track to get position
+
+
+\membersection{CDtoc::GetTotalTime}\label{cdtocgettotaltime}
+
+\constfunc{wxCDtime}{GetTotalTime}{\void}
+
+Returns the total time
+
+
+\membersection{wxCDAudio::wxCDAudio}\label{wxcdaudiowxcdaudio}
+
+\func{}{wxCDAudio}{\void}
+
+
+\membersection{wxCDAudio::\destruct{wxCDAudio}}\label{wxcdaudiodtor}
+
+\func{}{\destruct{wxCDAudio}}{\void}
+
+
+\membersection{wxCDAudio::Play}\label{wxcdaudioplay}
+
+\func{bool}{Play}{\param{const wxCDtime\& }{beg\_play}, \param{const wxCDtime\& }{end\_play}}
+
+Play audio at the specified position
+
+
+\membersection{wxCDAudio::Play}\label{wxcdaudioplay}
+
+\func{bool}{Play}{\param{const wxCDtime\& }{beg\_play}}
+
+Play audio from the specified to the end of the CD audio
+
+
+\membersection{wxCDAudio::Play}\label{wxcdaudioplay}
+
+\func{bool}{Play}{\param{wxUint8 }{beg\_track}, \param{wxUint8 }{end\_track = 0}}
+
+
+\membersection{wxCDAudio::Pause}\label{wxcdaudiopause}
+
+\func{bool}{Pause}{\void}
+
+Pause the audio playing
+
+
+\membersection{wxCDAudio::Resume}\label{wxcdaudioresume}
+
+\func{bool}{Resume}{\void}
+
+Resume a paused audio playing
+
+
+\membersection{wxCDAudio::GetStatus}\label{wxcdaudiogetstatus}
+
+\func{CDstatus}{GetStatus}{\void}
+
+Get the current CD status
+
+
+\membersection{wxCDAudio::GetTime}\label{wxcdaudiogettime}
+
+\func{wxCDtime}{GetTime}{\void}
+
+Get the current playing time
+
+
+\membersection{wxCDAudio::GetToc}\label{wxcdaudiogettoc}
+
+\func{const CDtoc\&}{GetToc}{\void}
+
+Returns the table of contents
+
+
+\membersection{wxCDAudio::Ok}\label{wxcdaudiook}
+
+\constfunc{bool}{Ok}{\void}
+
+CD ok
+
--- /dev/null
+\chapter{Change log}
+\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}
--- /dev/null
+chapter{Class reference}\label{classref}
+\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}
+
+These are the main \mmedia\ classes.
+
+\input sndbase.tex
+\input sndfile.tex
--- /dev/null
+\chapter{Introduction}
+\pagenumbering{arabic}%
+\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}
+
+The MMedia wxWindows extension is a wxWindows library which provides you
+a full set of multimedia classes including sound recording/playing,
+cd audio playing and video playing. The API is portable and can be used
+on any supported systems with the insurance the behaviour will be the
+same.
+
+\section{File structure}
+
+These are the files that comprise the \mmedia\ library.
+
+\begin{description}\itemsep=0pt
+\item[sndbase.h] Header for wxSoundStream base class and wxSoundFormat base class.
+\item[sndbase.cpp] Basic objects implementation.
+\item[sndfile.h] wxSoundFileStream base class header.
+\item[sndfile.cpp] wxSoundFileStream base class implementation.
+\item[sndpcm.h] wxSoundFormatPcm class header.
+\item[sndpcm.cpp] wxSoundFormatPcm class implementation.
+\item[sndcpcm.h] wxSoundCodecPcm class header (PCM converter).
+\item[sndcpcm.cpp] wxSoundCodecPcm class implementation (PCM converter).
+\item[sndulaw.h]
+\item[sndulaw.cpp]
+\item[sndg72x.h]
+\item[sndg72x.cpp]
+\item[sndoss.h]
+\item[sndoss.cpp]
+\item[sndesd.h]
+\item[sndesd.cpp]
+\item[sndwin.h]
+\item[sndwin.cpp]
+\item[cdbase.h]
+\item[cdbase.cpp]
+\item[cdunix.h]
+\item[cdunix.cpp]
+\item[cdwin.h]
+\item[cdwin.cpp]
+\item[vidbase.h]
+\item[vidbase.cpp]
+\item[vidxanm.h]
+\item[vidxanm.cpp]
+\item[vidwin.h]
+\item[vidwin.cpp]
+\end{description}
--- /dev/null
+\documentstyle[a4,makeidx,verbatim,texhelp,fancyhea,mysober,mytitle]{report}
+\newcommand{\ogl}[0]{{OGL}}%
+\definecolour{black}{0}{0}{0}%
+\definecolour{cyan}{0}{255}{255}%
+\definecolour{green}{0}{255}{0}%
+\definecolour{magenta}{255}{0}{255}%
+\definecolour{red}{255}{0}{0}%
+\definecolour{blue}{0}{0}{200}%
+\definecolour{yellow}{255}{255}{0}%
+\definecolour{white}{255}{255}{255}%
+\input psbox.tex
+\parindent 0pt
+\parskip 11pt
+\title{Object Graphics Library 3.0}
+\author{Julian Smart}
+\date{September 1998}
+
+\makeindex
+\begin{document}
+\maketitle
+
+\pagestyle{fancyplain}
+\bibliographystyle{plain}
+\pagenumbering{roman}
+\setheader{{\it CONTENTS}}{}{}{}{}{{\it CONTENTS}}
+\setfooter{\thepage}{}{}{}{}{\thepage}
+\tableofcontents%
+
+\input{intro.tex}
+%
+\input{sample.tex}
+%
+\input{classes.tex}
+%
+\input{topics.tex}
+%
+\input{bugs.tex}
+%
+\input{changes.tex}
+
+%
+\addcontentsline{toc}{chapter}{Index}
+\setheader{{\it INDEX}}{}{}{}{}{{\it INDEX}}
+\setfooter{\thepage}{}{}{}{}{\thepage}%
+\printindex
+\end{document}
--- /dev/null
+[OPTIONS]
+BMROOT=d:\wx2\wxwind~1\docs\latex\ogl ; Assume that bitmaps are where the source is
+TITLE=OGL Manual
+CONTENTS=Contents
+COMPRESS=HIGH
+
+[FILES]
+ogl.rtf
+
+[CONFIG]
+CreateButton("Up", "&Up", "JumpId(`ogl.hlp', `Contents')")
+BrowseButtons()
+
+[MAP]
+
+[BITMAPS]
+
--- /dev/null
+\chapter{OGLEdit: a sample OGL application}\label{ogledit}%
+\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}
+
+OGLEdit is a sample OGL application that allows the user to draw, edit,
+save and load a few shapes. It should clarify aspects of OGL usage, and
+can act as a template for similar applications. OGLEdit can be found in\rtfsp
+{\tt samples/ogledit} in the OGL distribution.
+
+$$\image{10cm;0cm}{ogledit.eps}$$\par
+
+The wxWindows document/view model has been used in OGL, to reduce the amount of
+housekeeping logic required to get it up and running. OGLEdit also provides
+a demonstration of the Undo/Redo capability supported by the document/view classes,
+and how a typical application might implement this feature.
+
+\section{OGLEdit files}
+
+OGLEdit comprises the following source files.
+
+\begin{itemize}\itemsep=0pt
+\item doc.h, doc.cpp: MyDiagram, DiagramDocument, DiagramCommand, MyEvtHandler
+classes related to diagram functionality and documents.
+\item view.h, view.cpp: MyCanvas, DiagramView classes related to visualisation of
+the diagram.
+\item ogledit.h, ogledit.cpp: MyFrame, MyApp classes related to the overall application.
+\item palette.h, palette.cpp: EditorToolPalette implementing the shape palette.
+\end{itemize}
+
+\section{How OGLEdit works}
+
+OGLEdit defines a DiagramDocument class, each of instance of which holds a MyDiagram
+member which itself contains the shapes.
+
+In order to implement specific mouse behaviour for shapes, a class MyEvtHandler is
+defined which is `plugged into' each shape when it is created, instead of overriding each shape class
+individually. This event handler class also holds a label string.
+
+The DiagramCommand class is the key to implementing Undo/Redo. Each instance of DiagramCommand
+stores enough information about an operation (create, delete, change colour etc.) to allow
+it to carry out (or undo) its command. In DiagramView::OnMenuCommand, when the user initiates the
+command, a new DiagramCommand instance is created which is then sent to the document's
+command processor (see wxWindows manual for more information about doc/view and command
+processing).
+
+Apart from menu commands, another way commands are initiated is by the user left-clicking on
+the canvas or right-dragging on a node. MyCanvas::OnLeftClick in view.cpp shows how
+the appropriate wxClassInfo is passed to a DiagramCommand, to allow DiagramCommand::Do
+to create a new shape given the wxClassInfo.
+
+The MyEvtHandler right-drag methods in doc.cpp implement drawing a line between
+two shapes, detecting where the right mouse button was released and looking for a second
+shape. Again, a new DiagramCommand instance is created and passed to the command
+processor to carry out the command.
+
+DiagramCommand::Do and DiagramCommand::Undo embody much of the
+interesting interaction with the OGL library. A complication of note
+when implementing undo is the problem of deleting a node shape which has
+one or more arcs attached to it. If you delete the node, the arc(s)
+should be deleted too. But multiple arc deletion represents more information
+that can be incorporated in the existing DiagramCommand scheme. OGLEdit
+copes with this by treating each arc deletion as a separate command, and
+sending Cut commands recursively, providing an undo path. Undoing such a
+Cut will only undo one command at a time - not a one to one
+correspondence with the original command - but it's a reasonable
+compromise and preserves Do/Undo whilst keeping our DiagramCommand class
+simple.
+
+\section{Possible enhancements}
+
+OGLEdit is very simplistic and does not employ the more advanced features
+of OGL, such as:
+
+\begin{itemize}\itemsep=0pt
+\item attachment points (arcs are drawn to particular points on a shape)
+\item metafile and bitmaps shapes
+\item divided rectangles
+\item composite shapes, and constraints
+\item creating labels in shape regions
+\item arc labels (OGL has support for three movable labels per arc)
+\item spline and multiple-segment line arcs
+\item adding annotations to node and arc shapes
+\item line-straightening (supported by OGL) and alignment (not supported directly by OGL)
+\end{itemize}
+
+These could be added to OGLEdit, at the risk of making it a less
+useful example for beginners.
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndaiff.h at 26/Feb/00 14:52:29
+%
+
+\section{\class{wxSoundAiff}}\label{wxsoundaiff}
+
+AIFF codec
+
+\wxheading{Derived from}
+
+\helpref{wxSoundFileStream}{wxsoundfilestream}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundAiff::wxSoundAiff}\label{wxsoundaiffwxsoundaiff}
+
+\func{}{wxSoundAiff}{\param{wxInputStream\& }{stream}, \param{wxSoundStream\& }{io\_sound}}
+
+\func{}{wxSoundAiff}{\param{wxOutputStream\& }{stream}, \param{wxSoundStream\& }{io\_sound}}
+
+\membersection{wxSoundAiff::\destruct{wxSoundAiff}}\label{wxsoundaiffdtor}
+
+\func{}{\destruct{wxSoundAiff}}{\void}
+
+
+\membersection{wxSoundAiff::CanRead}\label{wxsoundaiffcanread}
+
+\func{bool}{CanRead}{\void}
+
+
+\membersection{wxSoundAiff::GetCodecName}\label{wxsoundaiffgetcodecname}
+
+\constfunc{wxString}{GetCodecName}{\void}
+
+
+\membersection{wxSoundAiff::PrepareToPlay}\label{wxsoundaiffpreparetoplay}
+
+\func{bool}{PrepareToPlay}{\void}
+
+
+\membersection{wxSoundAiff::PrepareToRecord}\label{wxsoundaiffpreparetorecord}
+
+\func{bool}{PrepareToRecord}{\param{wxUint32 }{time}}
+
+
+\membersection{wxSoundAiff::FinishRecording}\label{wxsoundaifffinishrecording}
+
+\func{bool}{FinishRecording}{\void}
+
+
+\membersection{wxSoundAiff::RepositionStream}\label{wxsoundaiffrepositionstream}
+
+\func{bool}{RepositionStream}{\param{wxUint32 }{position}}
+
+
+\membersection{wxSoundAiff::GetData}\label{wxsoundaiffgetdata}
+
+\func{wxUint32}{GetData}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundAiff::PutData}\label{wxsoundaiffputdata}
+
+\func{wxUint32}{PutData}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
--- /dev/null
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Name: sndbase.tex
+%% Purpose: wxMMedia docs
+%% Author: Guilhem Lavaux <lavaux@easynet.fr>
+%% Modified by:
+%% Created: 2000
+%% RCS-ID: $Id$
+%% Copyright: (c) wxWindows team
+%% Licence: wxWindows licence
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{\class{wxSoundStream}}\label{wxsoundstream}
+
+Base class for sound streams
+
+\wxheading{Derived from}
+
+No base class
+
+\wxheading{Include files}
+
+<wx/mmedia/sndbase.h>
+
+\wxheading{Data structures}
+
+%%
+%% wxSoundStream errors
+%%
+
+\wxheading{wxSoundStream errors}
+
+\twocolwidtha{7cm}
+\begin{twocollist}\itemsep=0pt
+\twocolitem{{\bf wxSOUND\_NOERR}}{No error occured}
+\twocolitem{{\bf wxSOUND\_IOERR}}{An input/output error occured, it may concern
+either a driver or a file}
+\twocolitem{{\bf wxSOUND\_INVFRMT}}{The sound format passed to the function is
+invalid. Generally, it means that you passed out of range values to the codec
+stream or you don't pass the right sound format object to the right sound codec
+stream.}
+\twocolitem{{\bf wxSOUND\_INVDEV}}{Invalid device. Generally, it means that the
+sound stream didn't manage to open the device driver due to an invalid parameter
+or to the fact that sound is not supported on this computer.}
+\twocolitem{{\bf wxSOUND\_NOEXACT}}{No exact matching sound codec has been found for
+this sound format. It means that the sound driver didn't manage to setup the sound
+card with the specified values.}
+\twocolitem{{\bf wxSOUND\_NOCODEC}}{No matching codec has been found. Generally, it
+may happen when you call wxSoundRouterStream::SetSoundFormat().}
+\twocolitem{{\bf wxSOUND\_MEMERR}}{Not enough memory.}
+\end{twocollist}
+
+%%
+%% C callback
+%%
+
+\wxheading{C callback for wxSound event}
+
+When a sound event is generated, it may either call the internal sound event
+processor (which can be inherited) or call a C function. Its definition is:
+
+\begin{verbatim}
+ typedef void (*wxSoundCallback)(wxSoundStream *stream, int evt,
+ void *cdata);
+\end{verbatim}
+
+The {\bf stream} parameter represents the current wxSoundStream.
+
+The {\bf evt} parameter represents the sound event which is the cause of the calling. (See \helpref{wxSound events}{wxsoundstream}).
+
+The {\bf cdata} parameter represents the user callback data which were specified
+when the user called \helpref{wxSoundStream::Register}{wxsoundstreamregister}.
+
+{\it Note:} There are two other ways to catch sound events: you can inherit the
+sound stream and redefine \helpref{wxSoundStream::OnSoundEvent}{wxsoundstreamonsoundevent}, or you can reroute the events to another sound stream using \helpref{wxSoundStream::SetEventHandler}{wxsoundstreamseteventhandler}.
+
+%%
+%% wxSoundStream streaming mode
+%%
+
+\wxheading{wxSound streaming mode}
+
+The wxSoundStream object can work in three different modes. These modes are specified
+at the call to \helpref{wxSoundStream::StartProduction}{wxsoundstreamstartproduction}
+and cannot be changed until you call
+\helpref{wxSoundStream::StopProduction}{wxsoundstreamstopproduction}.
+
+The {\bf wxSOUND\_INPUT} mode is the recording mode. It generates {\bf wxSOUND\_INPUT}
+events and you cannot use wxSoundStream::Write().
+
+The {\bf wxSOUND\_OUTPUT} mode is the playing mode. It generates {\bf wxSOUND\_OUTPUT}
+events and you cannot use wxSoundStream::Read().
+
+The {\bf wxSOUND\_DUPLEX} mode activates the full duplex mode. The full duplex requires
+you to make synchronous call to \helpref{wxSoundStream::Read}{wxsoundstreamread} and
+\helpref{wxSoundStream::Write}{wxsoundstreamwrite}. This means that you must be
+careful with realtime problems. Each time you call Read you must call Write.
+
+%%
+%% wxSoundStream events
+%%
+
+\wxheading{wxSoundStream events}
+
+The sound events are generated when the sound driver (or the sound stream) completes
+a previous sound buffer. There are two possible sound events and two meanings.
+
+The {\bf wxSOUND\_INPUT} event is generated when the sound stream has a new input
+buffer ready to be read. You know that you can read a buffer of the size
+\helpref{GetBestSize()}{wxsoundstreamgetbestsize} without blocking.
+
+The {\bf wxSOUND\_OUTPUT} event is generated when the sound stream has completed a
+previous buffer. This buffer has been sent to the sound driver and it is ready to
+process a new buffer. Consequently, \helpref{Write}{wxsoundstreamwrite} will not
+block too.
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+%% Ctor && Dtor
+
+\membersection{wxSoundStream::wxSoundStream}\label{wxsoundstreamwxsoundstream}
+
+\func{}{wxSoundStream}{\void}
+
+Default constructor.
+
+\membersection{wxSoundStream::\destruct{wxSoundStream}}\label{wxsoundstreamdtor}
+
+\func{}{\destruct{wxSoundStream}}{\void}
+
+Destructor. The destructor stops automatically all started production and destroys
+any temporary buffer.
+
+%%
+%% Read
+%%
+
+\membersection{wxSoundStream::Read}\label{wxsoundstreamread}
+
+\func{wxSoundStream\&}{Read}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+Reads {\it len} bytes from the sound stream. This call may block the user so
+use it carefully when you need to intensively refresh the GUI. You may be
+interested by sound events: see \helpref{wxSoundStream::OnSoundEvent}{wxsoundstreamonsoundevent}.
+
+It is better to use the size returned by \helpref{wxSoundStream::GetBestSize}{wxsoundstreamgetbestsize}: this may improve performance or accuracy of the
+sound event system.
+
+\wxheading{Parameters}
+
+\docparam{len}{{\it len} is expressed in bytes. If you need to do conversions between bytes
+and seconds use wxSoundFormat.
+See \helpref{wxSoundFormatBase}{wxsoundformatbase}, \helpref{wxSoundStream::GetSoundFormat}{wxsoundstreamgetsoundformat}.}
+
+\docparam{data}{Data in \it{buffer} are coded using the sound format attached to this sound
+stream. The format is specified with
+\helpref{SetSoundFormat}{wxsoundstreamsetsoundformat}.}
+
+%%
+%% Write
+%%
+
+\membersection{wxSoundStream::Write}\label{wxsoundstreamwrite}
+
+\func{wxSoundStream\&}{Write}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+Writes \it{len} bytes to the sound stream. This call may block the user so
+use it carefully. You may be interested by sound events: see
+\helpref{wxSoundStream::OnSoundEvent}{wxsoundstreamonsoundevent}.
+
+It is better to use the size returned by \helpref{wxSoundStream::GetBestSize}{wxsoundstreamgetbestsize}: this may improve performance or accuracy of the
+sound event system.
+
+\wxheading{Parameters}
+
+\docparam{len}{This is expressed in bytes. If you need to do conversions between bytes
+and seconds use wxSoundFormat.
+See \helpref{wxSoundFormatBase}{wxsoundformatbase}, \helpref{wxSoundStream::GetSoundFormat}{wxsoundstreamgetsoundformat}.}
+
+\docparam{buffer}{Data in \it{buffer} are coded using the sound format attached to this sound
+stream. The format is specified with
+\helpref{SetSoundFormat}{wxsoundstreamsetsoundformat}.}
+
+%%
+%% GetBestSize
+%%
+
+\membersection{wxSoundStream::GetBestSize}\label{wxsoundstreamgetbestsize}
+
+\constfunc{wxUint32}{GetBestSize}{\void}
+
+This function returns the best size for IO calls. The best size provides you
+a good alignment for data to be written (or read) to (or from) the sound stream.
+So, when, for example, a sound event is sent, you are sure the sound stream
+will not block for this buffer size.
+
+%%
+%% wxSoundStream:SetSoundFormat
+%%
+
+\membersection{wxSoundStream::SetSoundFormat}\label{wxsoundstreamsetsoundformat}
+
+\func{bool}{SetSoundFormat}{\param{const wxSoundFormatBase\& }{format}}
+
+SetSoundFormat is one of the key function of the wxSoundStream object.
+It specifies the sound format the user needs. SetSoundFormat tries to
+apply the format to the current sound stream (it can be a sound file or a
+sound driver). Then, either it manages to apply it and it returns {\bf TRUE},
+or it could not and it returns {\bf FALSE}. In this case, you must check
+the error with
+\helpref{wxSoundStream::GetError}{wxsoundstreamgeterror}. See
+\helpref{wxSoundStream errors section}{wxsoundstreamerrors} for more details.
+
+
+\wxheading{Note}
+
+The {\bf format} object can be destroyed after the call. The object does not need it.
+
+\wxheading{Note}
+
+If the error is {\bf wxSOUND\_NOTEXACT}, the stream tries to find the best
+approaching format and setups it. You can check the format which it applied
+with \helpref{wxSoundStream::GetSoundFormat}{wxsoundstreamgetsoundformat}.
+
+%%
+%% GetSoundFormat
+%%
+\membersection{wxSoundStream::GetSoundFormat}\label{wxsoundstreamgetsoundformat}
+\constfunc{wxSoundFormatBase\&}{GetSoundFormat}{\void}
+
+It returns a reference to the current sound format of the stream represented by a
+wxSoundFormatBase object. This object {\it must not} be destroyed by anyone except
+the stream itself.
+
+%%
+%% SetCallback
+%%
+\membersection{wxSoundStream::SetCallback}\label{wxsoundstreamregister}
+
+\func{void}{Register}{\param{int }{evt}, \param{wxSoundCallback }{cbk}, \param{void* }{cdata}}
+
+It installs a C callback for wxSoundStream events. The C callbacks are still
+useful to avoid hard inheritance. You can install only one callback per event.
+Each callback has its callback data.
+
+%%
+%% StartProduction
+%%
+\membersection{wxSoundStream::StartProduction}\label{wxsoundstreamstartproduction}
+
+\func{bool}{StartProduction}{\param{int }{evt}}
+
+StartProduction starts the sound streaming. {\it evt} may be one of
+{\bf wxSOUND\_INPUT}, {\bf wxSOUND\_OUTPUT} or {\bf wxSOUND\_DUPLEX}.
+You cannot specify several flags at the same time. Starting the production
+may automaticaly in position of buffer underrun (only in the case you activated
+recording). Actually this may happen the sound IO queue is too short.
+It is also advised that you fill quickly enough the sound IO queue when the
+driver requests it (through a wxSoundEvent).
+
+\membersection{wxSoundStream::StopProduction}\label{wxsoundstreamstopproduction}
+\func{bool}{StopProduction}{\void}
+
+I stops the async notifier and the sound streaming straightly.
+
+\membersection{wxSoundStream::SetEventHandler}\label{wxsoundstreamseteventhandler}
+\func{void}{SetEventHandler}{\param{wxSoundStream* }{handler}}
+
+Sets the event handler: if it is non-null, all events are routed to it.
+
+\membersection{wxSoundStream::GetError}\label{wxsoundstreamgeterror}
+\constfunc{wxSoundError}{GetError}{\void}
+
+It returns the last error which occured.
+
+\membersection{wxSoundStream::GetLastAccess}\label{wxsoundstreamgetlastaccess}
+\constfunc{wxUint32}{GetLastAccess}{\void}
+
+It returns the number of bytes which were effectively written to/read from the sound stream.
+
+\membersection{wxSoundStream::QueueFilled}\label{wxsoundstreamqueuefilled}
+\constfunc{bool}{QueueFilled}{\void}
+
+It returns whether the sound IO queue is full. When it is full, the next IO call will block
+until the IO queue has at least one empty entry.
+
+\membersection{wxSoundStream::OnSoundEvent}\label{wxsoundstreamonsoundevent}
+\func{void}{OnSoundEvent}{\param{int }{evt}}
+
+It is called by the wxSoundStream when a new sound event occured.
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndcodec.h at 26/Feb/00 14:26:29
+%
+
+\section{\class{wxSoundStreamCodec}}\label{wxsoundstreamcodec}
+
+\wxheading{Derived from}
+
+\helpref{wxSoundStream}{wxsoundstream}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+\membersection{wxSoundStreamCodec::wxSoundStreamCodec}\label{wxsoundstreamcodecwxsoundstreamcodec}
+
+\func{}{wxSoundStreamCodec}{\param{wxSoundStream\& }{snd\_io}}
+
+
+\membersection{wxSoundStreamCodec::\destruct{wxSoundStreamCodec}}\label{wxsoundstreamcodecdtor}
+
+\func{}{\destruct{wxSoundStreamCodec}}{\void}
+
+
+\membersection{wxSoundStreamCodec::StartProduction}\label{wxsoundstreamcodecstartproduction}
+
+\func{bool}{StartProduction}{\param{int }{evt}}
+
+
+\membersection{wxSoundStreamCodec::StopProduction}\label{wxsoundstreamcodecstopproduction}
+
+\func{bool}{StopProduction}{\void}
+
+
+\membersection{wxSoundStreamCodec::GetBestSize}\label{wxsoundstreamcodecgetbestsize}
+
+\constfunc{wxUint32}{GetBestSize}{\void}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndesd.h at 26/Feb/00 14:26:56
+%
+
+\section{\class{wxSoundStreamESD}}\label{wxsoundstreamesd}
+
+ESD output class
+
+\wxheading{Derived from}
+
+\helpref{wxSoundStream}{wxsoundstream}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundStreamESD::wxSoundStreamESD}\label{wxsoundstreamesdwxsoundstreamesd}
+
+\func{}{wxSoundStreamESD}{\param{const wxString\& }{hostname = "localhost"}}
+
+
+\membersection{wxSoundStreamESD::\destruct{wxSoundStreamESD}}\label{wxsoundstreamesddtor}
+
+\func{}{\destruct{wxSoundStreamESD}}{\void}
+
+
+\membersection{wxSoundStreamESD::Read}\label{wxsoundstreamesdread}
+
+\func{wxSoundStream\&}{Read}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamESD::Write}\label{wxsoundstreamesdwrite}
+
+\func{wxSoundStream\&}{Write}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamESD::SetSoundFormat}\label{wxsoundstreamesdsetsoundformat}
+
+\func{bool}{SetSoundFormat}{\param{const wxSoundFormatBase\& }{format}}
+
+
+\membersection{wxSoundStreamESD::StartProduction}\label{wxsoundstreamesdstartproduction}
+
+\func{bool}{StartProduction}{\param{int }{evt}}
+
+
+\membersection{wxSoundStreamESD::StopProduction}\label{wxsoundstreamesdstopproduction}
+
+\func{bool}{StopProduction}{\void}
+
+
+\membersection{wxSoundStreamESD::WakeUpEvt}\label{wxsoundstreamesdwakeupevt}
+
+\func{void}{WakeUpEvt}{\param{int }{evt}}
+
+You should not call this.
+
+
+\membersection{wxSoundStreamESD::QueueFilled}\label{wxsoundstreamesdqueuefilled}
+
+\constfunc{bool}{QueueFilled}{\void}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndg72x.h at 26/Feb/00 14:52:19
+%
+
+
+\section{\class{wxSoundFormatG72X}}\label{wxsoundformatg72x}
+
+
+G72X format
+
+\wxheading{Derived from}
+
+\helpref{wxSoundFormatBase}{wxsoundformatbase}
+
+\wxheading{Data structures}
+
+{\small \begin{verbatim}
+typedef enum {
+ wxSOUND\_G721,
+ wxSOUND\_G723\_24,
+ wxSOUND\_G723\_40
+} wxSoundG72XType
+\end{verbatim}}
+
+{\small \begin{verbatim}
+typedef struct g72x\_state g72state
+\end{verbatim}}
+
+This fixes a bug in Mingw95
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+\membersection{wxSoundFormatG72X::wxSoundFormatG72X}\label{wxsoundformatg72xwxsoundformatg72x}
+
+\func{}{wxSoundFormatG72X}{\void}
+
+
+\membersection{wxSoundFormatG72X::\destruct{wxSoundFormatG72X}}\label{wxsoundformatg72xdtor}
+
+\func{}{\destruct{wxSoundFormatG72X}}{\void}
+
+
+\membersection{wxSoundFormatG72X::SetG72XType}\label{wxsoundformatg72xsetg72xtype}
+
+\func{void}{SetG72XType}{\param{wxSoundG72XType }{type}}
+
+
+\membersection{wxSoundFormatG72X::GetG72XType}\label{wxsoundformatg72xgetg72xtype}
+
+\constfunc{wxSoundG72XType}{GetG72XType}{\void}
+
+
+\membersection{wxSoundFormatG72X::SetSampleRate}\label{wxsoundformatg72xsetsamplerate}
+
+\func{void}{SetSampleRate}{\param{wxUint32 }{srate}}
+
+
+\membersection{wxSoundFormatG72X::GetSampleRate}\label{wxsoundformatg72xgetsamplerate}
+
+\constfunc{wxUint32}{GetSampleRate}{\void}
+
+
+\membersection{wxSoundFormatG72X::GetType}\label{wxsoundformatg72xgettype}
+
+\constfunc{wxSoundFormatType}{GetType}{\void}
+
+
+\membersection{wxSoundFormatG72X::Clone}\label{wxsoundformatg72xclone}
+
+\constfunc{wxSoundFormatBase*}{Clone}{\void}
+
+
+\membersection{wxSoundFormatG72X::GetTimeFromBytes}\label{wxsoundformatg72xgettimefrombytes}
+
+\constfunc{wxUint32}{GetTimeFromBytes}{\param{wxUint32 }{bytes}}
+
+
+\membersection{wxSoundFormatG72X::GetBytesFromTime}\label{wxsoundformatg72xgetbytesfromtime}
+
+\constfunc{wxUint32}{GetBytesFromTime}{\param{wxUint32 }{time}}
+
+
+\membersection{wxSoundFormatG72X::operator!=}\label{wxsoundformatg72xoperatorneq}
+
+\constfunc{bool}{operator!=}{\param{const wxSoundFormatBase\& }{frmt2}}
+
--- /dev/null
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Name: sndfile.tex
+%% Purpose: wxMMedia docs
+%% Author: Guilhem Lavaux <lavaux@easynet.fr>
+%% Modified by:
+%% Created: 2000
+%% RCS-ID: $Id$
+%% Copyright: (c) wxWindows team
+%% Licence: wxWindows licence
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{\class{wxSoundFileStream}}\label{wxsoundfilestream}
+
+Base class for file coders/decoders. This class is not constructor (it is an abstract
+class).
+
+\wxheading{Derived from}
+
+\helpref{wxSoundStream}{wxsoundstream}
+
+\wxheading{Include file}
+
+wx/sndfile.h
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+\membersection{wxSoundFileStream::wxSoundFileStream}\label{wxsoundfilestreamwxsoundfilestream}
+
+\func{}{wxSoundFileStream}{\param{wxInputStream\& }{stream}, \param{wxSoundStream\& }{io\_sound}}
+
+It constructs a new file decoder object which will send
+audio data to the specified sound stream.
+The {\it stream} is the input stream to be decoded. The
+{\it io_sound} is the destination sound stream.
+Once it has been constructed, you cannot change any of
+the specified streams nor the direction of the stream.
+
+You will have access to the playback functions.
+
+\func{}{wxSoundFileStream}{\param{wxOutputStream\& }{stream}, \param{wxSoundStream\& }{io\_sound}}
+
+It constructs a new file coder object which will get
+data to be recorded from the specified sound stream.
+The {\it stream} is the output wxStream. The {\it io_sound}
+is the source sound stream of the audio data. Once
+it has been constructed, you cannot change any of
+the specified streams nor the direction of the stream.
+
+\membersection{wxSoundFileStream::\destruct{wxSoundFileStream}}\label{wxsoundfilestreamdtor}
+\func{}{\destruct{wxSoundFileStream}}{\void}
+
+It destroys the current sound file codec.
+
+\membersection{wxSoundFileStream::Play}\label{wxsoundfilestreamplay}
+\func{bool}{Play}{\void}
+
+It starts playing the file. The playing begins, in background
+in nearly all cases, after the return of the function. The
+codec returns to a {\bf stopped} state when it reaches the
+end of the file.
+On success, it returns TRUE.
+
+\membersection{wxSoundFileStream::Record}\label{wxsoundfilestreamrecord}
+\func{bool}{Record}{\param{wxUint32 }{time}}
+
+It starts recording data from the sound stream and writing them
+to the output stream. You have to precise the recording length in
+parameter. This length is expressed in seconds. If you want to
+control the record length (using \helpref{Stop}{wxsoundfilestreamstop}),
+you can set it to wxSOUND_INFINITE_TIME.
+
+On success, it returns TRUE.
+
+\membersection{wxSoundFileStream::Stop}\label{wxsoundfilestreamstop}
+\func{bool}{Stop}{\void}
+
+It stops either recording or playing. Whatever happens (even unexpected
+errors), the stream is stopped when the function returns. When you are
+in recording mode, the file headers are updated and flushed if possible
+(ie: if the output stream is seekable).
+
+On success, it returns TRUE.
+
+\membersection{wxSoundFileStream::Pause}\label{wxsoundfilestreampause}
+\func{bool}{Pause}{\void}
+
+The file codec tries to pause the stream: it means that it stops audio
+production but keep the file pointer at the place.
+
+If the file codec is already paused, it returns FALSE.
+
+On success, it returns TREE.
+
+\membersection{wxSoundFileStream::Resume}\label{wxsoundfilestreamresume}
+\func{bool}{Resume}{\void}
+
+When the file codec has been paused using
+\helpref{Pause}{wxsoundfilestreampause}, you could be interrested in
+resuming it. This is the goal of this function.
+
+\membersection{wxSoundFileStream::IsStopped}\label{wxsoundfilestreamisstopped}
+\constfunc{bool}{IsStopped}{\void}
+
+It returns TRUE when the stream is stopped, in another case it returns
+FALSE.
+
+\membersection{wxSoundFileStream::IsPaused}\label{wxsoundfilestreamispaused}
+\constfunc{bool}{IsPaused}{\void}
+
+It returns TRUE when the stream is paused, in another case it returns
+FALSE.
+
+\membersection{wxSoundFileStream::StartProduction}\label{wxsoundfilestreamstartproduction}
+\func{bool}{StartProduction}{\param{int }{evt}}
+
+It is really not advised you call this function. From the wxSoundFileStream
+point of view it is an internal function. Internally, it is called after
+the file stream has been prepared to be played or to receive audio data and
+when it wants to start processing audio data.
+
+\membersection{wxSoundFileStream::StopProduction}\label{wxsoundfilestreamstopproduction}
+\func{bool}{StopProduction}{\void}
+
+As for \helpref{StartProduction}{wxsoundfilestreamstopproduction}, it is not
+advised for you to call this function. It is called by
+\helpref{Stop}{wxsoundfilestreamstop} when it needs to stop the audio data
+processing.
+
+\membersection{wxSoundFileStream::GetLength}\label{wxsoundfilestreamgetlength}
+\func{wxUint32}{GetLength}{\void}
+
+It returns the audio data length of the file stream. This length is expressed
+in bytes. If you need the length in seconds, you will need to use
+\helpref{GetSoundFormat}{wxsoundstreamgetsoundformat} and
+\helpref{GetTimeFromBytes}{wxsoundformatbasegettimefrombytes}.
+
+\membersection{wxSoundFileStream::GetPosition}\label{wxsoundfilestreamgetposition}
+\func{wxUint32}{GetPosition}{\void}
+
+It returns the current position in the soundfile stream. The position
+is expressed in bytes. If you need the length in seconds, you will need to use
+\helpref{GetSoundFormat}{wxsoundstreamgetsoundformat} and
+\helpref{GetTimeFromBytes}{wxsoundformatbasegettimefrombytes}.
+
+\membersection{wxSoundFileStream::SetPosition}\label{wxsoundfilestreamsetposition}
+\func{wxUint32}{SetPosition}{\param{wxUint32 }{new\_position}}
+
+It sets the current in the soundfile stream. The position
+ {\it new\_position} must be expressed in bytes. You can get
+a length/position in bytes from a time value using
+\helpref{GetSoundFormat}{wxsoundstreamgetsoundformat} and
+\helpref{GetTimeFromBytes}{wxsoundformatbasegettimefrombytes}.
+
+On success, it returns TRUE.
+
+\wxheading{Warning}
+
+Some wxStream may not be capable to support this function as
+it may not support the seekable functionnality. If this happens,
+it returns FALSE and leave the stream at the same position.
+
+\membersection{wxSoundFileStream::Read}\label{wxsoundfilestreamread}
+\func{wxSoundStream\&}{Read}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+You can obtain the audio data encoded in the file using this function.
+But it must be considered as an internal function. Used carelessly, it
+may corrupt the current state of the stream.
+Data are returned using in the original file coding (You must use a sound
+format object to decode it).
+
+\membersection{wxSoundFileStream::Write}\label{wxsoundfilestreamwrite}
+\func{wxSoundStream\&}{Write}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+You can put encoded audio data to the file using this function.
+But it must be considered as an internal function. Used carelessly, it
+may corrupt the current state of the stream.
+Data must be coded with the specified file coding (You must use a sound
+format object to do this).
+
+\membersection{wxSoundFileStream::SetSoundFormat}\label{wxsoundfilestreamsetsoundformat}
+\func{bool}{SetSoundFormat}{\param{const wxSoundFormatBase\& }{format}}
+
+\membersection{wxSoundFileStream::GetCodecName}\label{wxsoundfilestreamgetcodecname}
+\constfunc{wxString}{GetCodecName}{\void}
+
+This function returns the Codec name. This is useful for those who
+want to build a player (But also in some other case).
+
+\membersection{wxSoundFileStream::CanRead}\label{wxsoundfilestreamcanread}
+\func{bool}{CanRead}{\void}
+
+You should use this function to test whether this file codec can read
+the stream you passed to it.
+
+
+\membersection{wxSoundFileStream::PrepareToPlay}\label{wxsoundfilestreampreparetoplay}
+\func{bool}{PrepareToPlay}{\void}
+
+
+\membersection{wxSoundFileStream::PrepareToRecord}\label{wxsoundfilestreampreparetorecord}
+\func{bool}{PrepareToRecord}{\param{wxUint32 }{time}}
+
+
+\membersection{wxSoundFileStream::FinishRecording}\label{wxsoundfilestreamfinishrecording}
+\func{bool}{FinishRecording}{\void}
+
+
+\membersection{wxSoundFileStream::RepositionStream}\label{wxsoundfilestreamrepositionstream}
+
+\func{bool}{RepositionStream}{\param{wxUint32 }{position}}
+
+
+\membersection{wxSoundFileStream::FinishPreparation}\label{wxsoundfilestreamfinishpreparation}
+
+\func{void}{FinishPreparation}{\param{wxUint32 }{len}}
+
+
+\membersection{wxSoundFileStream::GetData}\label{wxsoundfilestreamgetdata}
+
+\func{wxUint32}{GetData}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundFileStream::PutData}\label{wxsoundfilestreamputdata}
+
+\func{wxUint32}{PutData}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundFileStream::OnSoundEvent}\label{wxsoundfilestreamonsoundevent}
+
+\func{void}{OnSoundEvent}{\param{int }{evt}}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndpcm.h at 26/Feb/00 14:26:33
+%
+
+
+\section{\class{wxSoundFormatPcm}}\label{wxsoundformatpcm}
+
+
+PCM specification class
+
+\wxheading{Derived from}
+
+\helpref{wxSoundFormatBase}{wxsoundformatbase}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundFormatPcm::wxSoundFormatPcm}\label{wxsoundformatpcmwxsoundformatpcm}
+
+\func{}{wxSoundFormatPcm}{\param{wxUint32 }{srate = 22500}, \param{wxUint8 }{bps = 8}, \param{wxUint16 }{channels = 2}, \param{bool }{sign = TRUE}, \param{int }{order = wxLITTLE\_ENDIAN}}
+
+
+\membersection{wxSoundFormatPcm::\destruct{wxSoundFormatPcm}}\label{wxsoundformatpcmdtor}
+
+\func{}{\destruct{wxSoundFormatPcm}}{\void}
+
+
+\membersection{wxSoundFormatPcm::SetSampleRate}\label{wxsoundformatpcmsetsamplerate}
+
+\func{void}{SetSampleRate}{\param{wxUint32 }{srate}}
+
+
+\membersection{wxSoundFormatPcm::SetBPS}\label{wxsoundformatpcmsetbps}
+
+\func{void}{SetBPS}{\param{wxUint8 }{bps}}
+
+
+\membersection{wxSoundFormatPcm::SetChannels}\label{wxsoundformatpcmsetchannels}
+
+\func{void}{SetChannels}{\param{wxUint16 }{nchannels}}
+
+
+\membersection{wxSoundFormatPcm::SetOrder}\label{wxsoundformatpcmsetorder}
+
+\func{void}{SetOrder}{\param{int }{order}}
+
+
+\membersection{wxSoundFormatPcm::Signed}\label{wxsoundformatpcmsigned}
+
+\func{void}{Signed}{\param{bool }{sign}}
+
+
+\membersection{wxSoundFormatPcm::GetSampleRate}\label{wxsoundformatpcmgetsamplerate}
+
+\constfunc{wxUint32}{GetSampleRate}{\void}
+
+
+\membersection{wxSoundFormatPcm::GetBPS}\label{wxsoundformatpcmgetbps}
+
+\constfunc{wxUint8}{GetBPS}{\void}
+
+
+\membersection{wxSoundFormatPcm::GetChannels}\label{wxsoundformatpcmgetchannels}
+
+\constfunc{wxUint16}{GetChannels}{\void}
+
+
+\membersection{wxSoundFormatPcm::GetOrder}\label{wxsoundformatpcmgetorder}
+
+\constfunc{int}{GetOrder}{\void}
+
+
+\membersection{wxSoundFormatPcm::Signed}\label{wxsoundformatpcmgetsigned}
+
+\constfunc{bool}{Signed}{\void}
+
+
+\membersection{wxSoundFormatPcm::GetType}\label{wxsoundformatpcmgettype}
+
+\constfunc{wxSoundFormatType}{GetType}{\void}
+
+
+\membersection{wxSoundFormatPcm::Clone}\label{wxsoundformatpcmclone}
+
+\constfunc{wxSoundFormatBase*}{Clone}{\void}
+
+
+\membersection{wxSoundFormatPcm::GetTimeFromBytes}\label{wxsoundformatpcmgettimefrombytes}
+
+\constfunc{wxUint32}{GetTimeFromBytes}{\param{wxUint32 }{bytes}}
+
+
+\membersection{wxSoundFormatPcm::GetBytesFromTime}\label{wxsoundformatpcmgetbytesfromtime}
+
+\constfunc{wxUint32}{GetBytesFromTime}{\param{wxUint32 }{time}}
+
+
+\membersection{wxSoundFormatPcm::operator!}\label{wxsoundformatpcmoperatornot}
+
+\constfunc{bool}{operator!}{\param{const wxSoundFormatBase\& }{frmt2}}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndbase.h at 26/Feb/00 14:23:29
+%
+
+
+\section{\class{wxSoundFormatBase}}\label{wxsoundformatbase}
+
+
+Base class for sound format specification
+
+\wxheading{Derived from}
+
+No base class
+
+\wxheading{Data structures}
+
+{\small \begin{verbatim}
+typedef enum {
+ wxSOUND\_NOFORMAT,
+ wxSOUND\_PCM,
+ wxSOUND\_ULAW,
+ wxSOUND\_G72X,
+ wxSOUND\_MSADPCM
+} wxSoundFormatType
+\end{verbatim}}
+
+wxSoundFormatType: it specifies the format family of the sound data
+which will be passed to the stream.
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+\membersection{wxSoundFormatBase::wxSoundFormatBase}\label{wxsoundformatbasewxsoundformatbase}
+
+\func{}{wxSoundFormatBase}{\void}
+
+
+\membersection{wxSoundFormatBase::\destruct{wxSoundFormatBase}}\label{wxsoundformatbasedtor}
+
+\func{}{\destruct{wxSoundFormatBase}}{\void}
+
+
+\membersection{wxSoundFormatBase::GetType}\label{wxsoundformatbasegettype}
+
+\constfunc{wxSoundFormatType}{GetType}{\void}
+
+It returns a "standard" format type.
+
+
+\membersection{wxSoundFormatBase::Clone}\label{wxsoundformatbaseclone}
+
+\constfunc{wxSoundFormatBase*}{Clone}{\void}
+
+It clones the current format.
+
+
+\membersection{wxSoundFormatBase::GetTimeFromBytes}\label{wxsoundformatbasegettimefrombytes}
+
+\constfunc{wxUint32}{GetTimeFromBytes}{\param{wxUint32 }{bytes}}
+
+
+\membersection{wxSoundFormatBase::GetBytesFromTime}\label{wxsoundformatbasegetbytesfromtime}
+
+\constfunc{wxUint32}{GetBytesFromTime}{\param{wxUint32 }{time}}
+
+
+\membersection{wxSoundFormatBase::operator!=}\label{wxsoundformatbaseoperatorneq}
+
+\constfunc{bool}{operator!=}{\param{const wxSoundFormatBase\& }{frmt2}}
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndulaw.h at 26/Feb/00 14:52:25
+%
+
+
+\section{\class{wxSoundFormatUlaw}}\label{wxsoundformatulaw}
+
+
+ULAW format
+
+\wxheading{Derived from}
+
+\helpref{wxSoundFormatBase}{wxsoundformatbase}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundFormatUlaw::wxSoundFormatUlaw}\label{wxsoundformatulawwxsoundformatulaw}
+
+\func{}{wxSoundFormatUlaw}{\void}
+
+
+\membersection{wxSoundFormatUlaw::\destruct{wxSoundFormatUlaw}}\label{wxsoundformatulawdtor}
+
+\func{}{\destruct{wxSoundFormatUlaw}}{\void}
+
+
+\membersection{wxSoundFormatUlaw::SetSampleRate}\label{wxsoundformatulawsetsamplerate}
+
+\func{void}{SetSampleRate}{\param{wxUint32 }{srate}}
+
+
+\membersection{wxSoundFormatUlaw::GetSampleRate}\label{wxsoundformatulawgetsamplerate}
+
+\constfunc{wxUint32}{GetSampleRate}{\void}
+
+
+\membersection{wxSoundFormatUlaw::SetChannels}\label{wxsoundformatulawsetchannels}
+
+\func{void}{SetChannels}{\param{wxUint8 }{channels}}
+
+
+\membersection{wxSoundFormatUlaw::GetChannels}\label{wxsoundformatulawgetchannels}
+
+\constfunc{wxUint8}{GetChannels}{\void}
+
+
+\membersection{wxSoundFormatUlaw::GetType}\label{wxsoundformatulawgettype}
+
+\constfunc{wxSoundFormatType}{GetType}{\void}
+
+
+\membersection{wxSoundFormatUlaw::Clone}\label{wxsoundformatulawclone}
+
+\constfunc{wxSoundFormatBase*}{Clone}{\void}
+
+
+\membersection{wxSoundFormatUlaw::GetTimeFromBytes}\label{wxsoundformatulawgettimefrombytes}
+
+\constfunc{wxUint32}{GetTimeFromBytes}{\param{wxUint32 }{bytes}}
+
+
+\membersection{wxSoundFormatUlaw::GetBytesFromTime}\label{wxsoundformatulawgetbytesfromtime}
+
+\constfunc{wxUint32}{GetBytesFromTime}{\param{wxUint32 }{time}}
+
+
+\membersection{wxSoundFormatUlaw::operator!=}\label{wxsoundformatulawoperatorneq}
+
+\constfunc{bool}{operator!=}{\param{const wxSoundFormatBase\& }{frmt2}}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndg72x.h at 26/Feb/00 14:52:19
+%
+
+
+\section{\class{wxSoundStreamG72X}}\label{wxsoundstreamg72x}
+
+
+ULAW converter class
+
+\wxheading{Derived from}
+
+\helpref{wxSoundStreamCodec}{wxsoundstreamcodec}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundStreamG72X::wxSoundStreamG72X}\label{wxsoundstreamg72xwxsoundstreamg72x}
+
+\func{}{wxSoundStreamG72X}{\param{wxSoundStream\& }{sndio}}
+
+
+\membersection{wxSoundStreamG72X::\destruct{wxSoundStreamG72X}}\label{wxsoundstreamg72xdtor}
+
+\func{}{\destruct{wxSoundStreamG72X}}{\void}
+
+
+\membersection{wxSoundStreamG72X::Read}\label{wxsoundstreamg72xread}
+
+\func{wxSoundStream\&}{Read}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamG72X::Write}\label{wxsoundstreamg72xwrite}
+
+\func{wxSoundStream\&}{Write}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamG72X::SetSoundFormat}\label{wxsoundstreamg72xsetsoundformat}
+
+\func{bool}{SetSoundFormat}{\param{const wxSoundFormatBase\& }{format}}
+
+
+\membersection{wxSoundStreamG72X::PutBits}\label{wxsoundstreamg72xputbits}
+
+\func{void}{PutBits}{\param{wxUint8 }{bits}}
+
+
+\membersection{wxSoundStreamG72X::GetBits}\label{wxsoundstreamg72xgetbits}
+
+\func{wxUint8}{GetBits}{\void}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndoss.h at 26/Feb/00 14:26:53
+%
+
+
+\section{\class{wxSoundStreamOSS}}\label{wxsoundstreamoss}
+
+
+OSS output class
+
+\wxheading{Derived from}
+
+\helpref{wxSoundStream}{wxsoundstream}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundStreamOSS::wxSoundStreamOSS}\label{wxsoundstreamosswxsoundstreamoss}
+
+\func{}{wxSoundStreamOSS}{\param{const wxString\& }{dev\_name = \_T("/dev/dsp")}}
+
+
+\membersection{wxSoundStreamOSS::\destruct{wxSoundStreamOSS}}\label{wxsoundstreamossdtor}
+
+\func{}{\destruct{wxSoundStreamOSS}}{\void}
+
+
+\membersection{wxSoundStreamOSS::Read}\label{wxsoundstreamossread}
+
+\func{wxSoundStream\&}{Read}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamOSS::Write}\label{wxsoundstreamosswrite}
+
+\func{wxSoundStream\&}{Write}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamOSS::GetBestSize}\label{wxsoundstreamossgetbestsize}
+
+\constfunc{wxUint32}{GetBestSize}{\void}
+
+
+\membersection{wxSoundStreamOSS::SetSoundFormat}\label{wxsoundstreamosssetsoundformat}
+
+\func{bool}{SetSoundFormat}{\param{const wxSoundFormatBase\& }{format}}
+
+
+\membersection{wxSoundStreamOSS::StartProduction}\label{wxsoundstreamossstartproduction}
+
+\func{bool}{StartProduction}{\param{int }{evt}}
+
+
+\membersection{wxSoundStreamOSS::StopProduction}\label{wxsoundstreamossstopproduction}
+
+\func{bool}{StopProduction}{\void}
+
+
+\membersection{wxSoundStreamOSS::QueueFilled}\label{wxsoundstreamossqueuefilled}
+
+\constfunc{bool}{QueueFilled}{\void}
+
+
+\membersection{wxSoundStreamOSS::WakeUpEvt}\label{wxsoundstreamosswakeupevt}
+
+\func{void}{WakeUpEvt}{\param{int }{evt}}
+
+You should not call this.
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndcpcm.h at 26/Feb/00 14:26:35
+%
+
+
+\section{\class{wxSoundStreamPcm}}\label{wxsoundstreampcm}
+
+
+PCM converter class
+
+\wxheading{Derived from}
+
+\helpref{wxSoundStreamCodec}{wxsoundstreamcodec}
+
+\wxheading{Data structures}
+
+{\small \begin{verbatim}
+typedef void (*ConverterType)(const char *buf\_in, char *buf\_out, wxUint32 len) ConverterType
+\end{verbatim}}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundStreamPcm::wxSoundStreamPcm}\label{wxsoundstreampcmwxsoundstreampcm}
+
+\func{}{wxSoundStreamPcm}{\param{wxSoundStream\& }{sndio}}
+
+
+\membersection{wxSoundStreamPcm::\destruct{wxSoundStreamPcm}}\label{wxsoundstreampcmdtor}
+
+\func{}{\destruct{wxSoundStreamPcm}}{\void}
+
+
+\membersection{wxSoundStreamPcm::Read}\label{wxsoundstreampcmread}
+
+\func{wxSoundStream\&}{Read}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamPcm::Write}\label{wxsoundstreampcmwrite}
+
+\func{wxSoundStream\&}{Write}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamPcm::SetSoundFormat}\label{wxsoundstreampcmsetsoundformat}
+
+\func{bool}{SetSoundFormat}{\param{const wxSoundFormatBase\& }{format}}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndfile.h at 26/Feb/00 14:26:42
+%
+
+
+\section{\class{wxSoundRouterStream}}\label{wxsoundrouterstream}
+
+
+Codec router class
+
+\wxheading{Derived from}
+
+\helpref{wxSoundStreamCodec}{wxsoundstreamcodec}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundRouterStream::wxSoundRouterStream}\label{wxsoundrouterstreamwxsoundrouterstream}
+
+\func{}{wxSoundRouterStream}{\param{wxSoundStream\& }{sndio}}
+
+
+\membersection{wxSoundRouterStream::\destruct{wxSoundRouterStream}}\label{wxsoundrouterstreamdtor}
+
+\func{}{\destruct{wxSoundRouterStream}}{\void}
+
+
+\membersection{wxSoundRouterStream::Read}\label{wxsoundrouterstreamread}
+
+\func{wxSoundStream\&}{Read}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundRouterStream::Write}\label{wxsoundrouterstreamwrite}
+
+\func{wxSoundStream\&}{Write}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundRouterStream::SetSoundFormat}\label{wxsoundrouterstreamsetsoundformat}
+
+\func{bool}{SetSoundFormat}{\param{const wxSoundFormatBase\& }{format}}
+
+
+\membersection{wxSoundRouterStream::StartProduction}\label{wxsoundrouterstreamstartproduction}
+
+\func{bool}{StartProduction}{\param{int }{evt}}
+
+
+\membersection{wxSoundRouterStream::StopProduction}\label{wxsoundrouterstreamstopproduction}
+
+\func{bool}{StopProduction}{\void}
+
+
+\membersection{wxSoundRouterStream::GetBestSize}\label{wxsoundrouterstreamgetbestsize}
+
+\constfunc{wxUint32}{GetBestSize}{\void}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndulaw.h at 26/Feb/00 14:52:25
+%
+
+
+\section{\class{wxSoundStreamUlaw}}\label{wxsoundstreamulaw}
+
+
+ULAW converter class
+
+\wxheading{Derived from}
+
+\helpref{wxSoundStreamCodec}{wxsoundstreamcodec}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundStreamUlaw::wxSoundStreamUlaw}\label{wxsoundstreamulawwxsoundstreamulaw}
+
+\func{}{wxSoundStreamUlaw}{\param{wxSoundStream\& }{sndio}}
+
+
+\membersection{wxSoundStreamUlaw::\destruct{wxSoundStreamUlaw}}\label{wxsoundstreamulawdtor}
+
+\func{}{\destruct{wxSoundStreamUlaw}}{\void}
+
+
+\membersection{wxSoundStreamUlaw::Read}\label{wxsoundstreamulawread}
+
+\func{wxSoundStream\&}{Read}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamUlaw::Write}\label{wxsoundstreamulawwrite}
+
+\func{wxSoundStream\&}{Write}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamUlaw::SetSoundFormat}\label{wxsoundstreamulawsetsoundformat}
+
+\func{bool}{SetSoundFormat}{\param{const wxSoundFormatBase\& }{format}}
+
+
+\membersection{wxSoundStreamUlaw::GetBestSize}\label{wxsoundstreamulawgetbestsize}
+
+\constfunc{wxUint32}{GetBestSize}{\void}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndwav.h at 26/Feb/00 14:26:40
+%
+
+
+\section{\class{wxSoundWave}}\label{wxsoundwave}
+
+
+WAVE codec
+
+\wxheading{Derived from}
+
+\helpref{wxSoundFileStream}{wxsoundfilestream}
+
+\wxheading{Data structures}
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundWave::wxSoundWave}\label{wxsoundwavewxsoundwave}
+
+\func{}{wxSoundWave}{\param{wxInputStream\& }{stream}, \param{wxSoundStream\& }{io\_sound}}
+
+\func{}{wxSoundWave}{\param{wxOutputStream\& }{stream}, \param{wxSoundStream\& }{io\_sound}}
+
+
+\membersection{wxSoundWave::\destruct{wxSoundWave}}\label{wxsoundwavedtor}
+
+\func{}{\destruct{wxSoundWave}}{\void}
+
+
+\membersection{wxSoundWave::CanRead}\label{wxsoundwavecanread}
+
+\func{bool}{CanRead}{\void}
+
+
+\membersection{wxSoundWave::GetCodecName}\label{wxsoundwavegetcodecname}
+
+\constfunc{wxString}{GetCodecName}{\void}
+
+
+\membersection{wxSoundWave::PrepareToPlay}\label{wxsoundwavepreparetoplay}
+
+\func{bool}{PrepareToPlay}{\void}
+
+
+\membersection{wxSoundWave::PrepareToRecord}\label{wxsoundwavepreparetorecord}
+
+\func{bool}{PrepareToRecord}{\param{wxUint32 }{time}}
+
+
+\membersection{wxSoundWave::FinishRecording}\label{wxsoundwavefinishrecording}
+
+\func{bool}{FinishRecording}{\void}
+
+
+\membersection{wxSoundWave::RepositionStream}\label{wxsoundwaverepositionstream}
+
+\func{bool}{RepositionStream}{\param{wxUint32 }{position}}
+
+
+\membersection{wxSoundWave::GetData}\label{wxsoundwavegetdata}
+
+\func{wxUint32}{GetData}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundWave::PutData}\label{wxsoundwaveputdata}
+
+\func{wxUint32}{PutData}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundWave::HandleOutputPCM}\label{wxsoundwavehandleoutputpcm}
+
+\func{bool}{HandleOutputPCM}{\param{wxDataInputStream\& }{data}, \param{wxUint16 }{channels}, \param{wxUint32 }{sample\_fq}, \param{wxUint32 }{byte\_p\_sec}, \param{wxUint16 }{byte\_p\_spl}, \param{wxUint16 }{bits\_p\_spl}}
+
+
+\membersection{wxSoundWave::HandleOutputG721}\label{wxsoundwavehandleoutputg721}
+
+\func{bool}{HandleOutputG721}{\param{wxDataInputStream\& }{data}, \param{wxUint16 }{channels}, \param{wxUint32 }{sample\_fq}, \param{wxUint32 }{byte\_p\_sec}, \param{wxUint16 }{byte\_p\_spl}, \param{wxUint16 }{bits\_p\_spl}}
+
+
+\membersection{wxSoundWave::HandleInputPCM}\label{wxsoundwavehandleinputpcm}
+
+\func{wxSoundFormatBase*}{HandleInputPCM}{\param{wxDataOutputStream\& }{data}}
+
+
+\membersection{wxSoundWave::HandleInputG72X}\label{wxsoundwavehandleinputg72x}
+
+\func{wxSoundFormatBase*}{HandleInputG72X}{\param{wxDataOutputStream\& }{data}}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/sndwin.h at 26/Feb/00 14:26:51
+%
+
+
+\section{\class{wxSoundStreamWin}}\label{wxsoundstreamwin}
+
+\wxheading{Derived from}
+
+\helpref{wxSoundStream}{wxsoundstream}
+
+\wxheading{Data structures}
+
+{\small \begin{verbatim}
+typedef struct \_wxSoundInternal wxSoundInternal
+\end{verbatim}}
+
+{\small \begin{verbatim}
+typedef struct \_wxSoundInfoHeader wxSoundInfoHeader
+\end{verbatim}}
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxSoundStreamWin::wxSoundStreamWin}\label{wxsoundstreamwinwxsoundstreamwin}
+
+\func{}{wxSoundStreamWin}{\void}
+
+
+\membersection{wxSoundStreamWin::\destruct{wxSoundStreamWin}}\label{wxsoundstreamwindtor}
+
+\func{}{\destruct{wxSoundStreamWin}}{\void}
+
+
+\membersection{wxSoundStreamWin::Write}\label{wxsoundstreamwinwrite}
+
+\func{wxSoundStream\&}{Write}{\param{const void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamWin::Read}\label{wxsoundstreamwinread}
+
+\func{wxSoundStream\&}{Read}{\param{void* }{buffer}, \param{wxUint32 }{len}}
+
+
+\membersection{wxSoundStreamWin::SetSoundFormat}\label{wxsoundstreamwinsetsoundformat}
+
+\func{bool}{SetSoundFormat}{\param{wxSoundFormatBase\& }{base}}
+
+
+\membersection{wxSoundStreamWin::StartProduction}\label{wxsoundstreamwinstartproduction}
+
+\func{bool}{StartProduction}{\param{int }{evt}}
+
+
+\membersection{wxSoundStreamWin::StopProduction}\label{wxsoundstreamwinstopproduction}
+
+\func{bool}{StopProduction}{\void}
+
+
+\membersection{wxSoundStreamWin::QueueFilled}\label{wxsoundstreamwinqueuefilled}
+
+\constfunc{bool}{QueueFilled}{\void}
+
+
+\membersection{wxSoundStreamWin::NotifyDoneBuffer}\label{wxsoundstreamwinnotifydonebuffer}
+
+\func{void}{NotifyDoneBuffer}{\param{wxUint32 }{dev\_handle}, \param{int }{flag}}
+
+Internal but defined as public
+
+
+\membersection{wxSoundStreamWin::GetBestSize}\label{wxsoundstreamwingetbestsize}
+
+\constfunc{wxUint32}{GetBestSize}{\void}
+
+
+\membersection{wxSoundStreamWin::CreateSndWindow}\label{wxsoundstreamwincreatesndwindow}
+
+\func{void}{CreateSndWindow}{\void}
+
+
+\membersection{wxSoundStreamWin::DestroySndWindow}\label{wxsoundstreamwindestroysndwindow}
+
+\func{void}{DestroySndWindow}{\void}
+
+
+\membersection{wxSoundStreamWin::OpenDevice}\label{wxsoundstreamwinopendevice}
+
+\func{bool}{OpenDevice}{\param{int }{mode}}
+
+
+\membersection{wxSoundStreamWin::CloseDevice}\label{wxsoundstreamwinclosedevice}
+
+\func{void}{CloseDevice}{\void}
+
+
+\membersection{wxSoundStreamWin::AllocHeader}\label{wxsoundstreamwinallocheader}
+
+\func{wxSoundInfoHeader*}{AllocHeader}{\param{int }{mode}}
+
+
+\membersection{wxSoundStreamWin::FreeHeader}\label{wxsoundstreamwinfreeheader}
+
+\func{void}{FreeHeader}{\param{wxSoundInfoHeader* }{header}, \param{int }{mode}}
+
+
+\membersection{wxSoundStreamWin::AllocHeaders}\label{wxsoundstreamwinallocheaders}
+
+\func{bool}{AllocHeaders}{\param{int }{mode}}
+
+
+\membersection{wxSoundStreamWin::FreeHeaders}\label{wxsoundstreamwinfreeheaders}
+
+\func{void}{FreeHeaders}{\param{int }{mode}}
+
+
+\membersection{wxSoundStreamWin::WaitFor}\label{wxsoundstreamwinwaitfor}
+
+\func{void}{WaitFor}{\param{wxSoundInfoHeader* }{info}}
+
+
+\membersection{wxSoundStreamWin::AddToQueue}\label{wxsoundstreamwinaddtoqueue}
+
+\func{bool}{AddToQueue}{\param{wxSoundInfoHeader* }{info}}
+
+
+\membersection{wxSoundStreamWin::ClearHeader}\label{wxsoundstreamwinclearheader}
+
+\func{void}{ClearHeader}{\param{wxSoundInfoHeader* }{info}}
+
+
+\membersection{wxSoundStreamWin::NextFragmentOutput}\label{wxsoundstreamwinnextfragmentoutput}
+
+\func{wxSoundInfoHeader*}{NextFragmentOutput}{\void}
+
+
+\membersection{wxSoundStreamWin::NextFragmentInput}\label{wxsoundstreamwinnextfragmentinput}
+
+\func{wxSoundInfoHeader*}{NextFragmentInput}{\void}
+
--- /dev/null
+; Last change: JS 8 Sep 98 2:54 pm
+runTwice = yes
+titleFontSize = 12
+authorFontSize = 10
+chapterFontSize = 12
+sectionFontSize = 12
+subsectionFontSize = 12
+headerRule = yes
+footerRule = yes
+useHeadingStyles = yes
+listItemIndent=40
+generateHPJ = no
+htmlBrowseButtons = bitmap
+winHelpVersion = 3
+winHelpContents = yes
+winHelpTitle = "OGL Manual"
+truncateFilenames = yes
+combineSubSections = yes
+\overview [2] {\rtfonly{See also }\settransparency{on}\sethotspotcolour{off}\sethotspotunderline{on}\winhelponly{\image{}{books.bmp}\settransparency{off}}
+\htmlonly{\image{}{books.gif}}\helpref{#1}{#2}
+\sethotspotcolour{on}\sethotspotunderline{on}}
+\docparam [2]{\parskip{0}{\it #1}\htmlignore{\par}\parskip{10}\indented{1cm}{#2}}
+\wxheading [1]{{\bf \htmlignore{\fcol{blue}{#1}}\htmlonly{\fcol{red}{#1}}}}
+\const [0] {{\bf const}}
+\constfunc [3] {{\bf #1} {\bf #2}(#3) {\bf const}\index{#2}}
+\windowstyle [1] {{\bf #1}\index{#1}}
+
+;;
+;; These two are for generating MS HTML Help project, contents and index files.
+;;
+htmlWorkshopFiles = true
+htmlIndex = true
+\pythonnote [1] {{\bf \fcol{blue}{wxPython note:}} #1}
+%\pythonnote [1] {}
+
--- /dev/null
+% LaTeX style file
+% Name: texhelp.sty
+% Author: Julian Smart
+%
+% Purpose
+% -------
+% Style file to enable the simultaneous preparation of printed LaTeX and on-line
+% hypertext manuals.
+% Use in conjunction with Tex2RTF (see Tex2RTF documentation).
+%
+% Note that if a non-ASCII character starts a newline and there should be a space
+% between the last word on the previous line and the first word on this line,
+% you need to use \rtfsp to generate a space in Windows Help. \rtfsp is ignored
+% in all other formats.
+%
+% Julian Smart
+% Artificial Intelligence Applications Institute
+%
+%
+% ============== C++/CLIPS Documentation Facilities ==============
+%
+% Each class definition should be typeset with e.g.
+%
+% \section{\class{Name}: Parent}
+%
+% followed by a description of the class.
+% Each member should follow:
+%
+% \membersection{wxName::Member}
+%
+% with a description of what this member does.
+% Then, one (or more if overloaded) member (function) in detail:
+%
+% \func{return type}{name}{args}
+% or
+% \member{type}{name}
+%
+% where args is a list of \param{type}{name}, ...
+
+% Function, e.g.
+% e.g. to typeset
+%
+% void DoIt(char *string);
+%
+% write:
+%
+% \func{void}{DoIt}{\param{char *}{string}}
+%
+
+\newcommand{\func}[3]{\hangafter=1\noindent\hangindent=10mm
+{{\it #1} {\bf #2}\index{#2}}(#3)}
+
+% For function/type definition where the name is a pointer,
+% e.g. to typeset
+%
+% typedef void (*wxFunction)(wxObject&)
+%
+% write:
+%
+% \pfunc{typedef void}{wxFunction}{param{wxObject&}}
+
+\newcommand{\pfunc}[3]{\hangafter=1\noindent\hangindent=10mm
+{{\it #1} ({\bf *#2})\index{#2}}(#3)}
+
+% Use an ordinary \section command for class name definitions.
+
+% This is used for a member, such as wxBitmap: GetDepth
+\newcommand{\membersection}[1]{\subsection*{#1}\index{#1}}
+
+% CLIPS function
+\newcommand{\clipsfunc}[3]{\hangafter=1\noindent\hangindent=10mm
+{{\bf #1} ({\bf #2}\index{#2}}#3)}
+
+\newcommand{\clipssection}[1]{\chapter{#1}}
+
+% This is used for a CLIPS function name
+\newcommand{\functionsection}[1]{\subsection*{#1}}
+
+% Member: a type and a name
+\newcommand{\member}[2]{{\bf #1 \it #2}}
+
+% C++ Parameter: a type and a name (no intervening space)
+\newcommand{\param}[2]{{\it #1}{\bf #2}}
+
+% CLIPS Parameter: a type and a name (one intervening space)
+\newcommand{\cparam}[2]{{\bf #1} {\it #2}}
+
+% Class: puts in index
+\newcommand{\class}[1]{#1\index{#1}}
+
+%\newcommand{\docparam}[2]{\parskip=0pt {\it #1}\par\parskip=10pt\begin{indented}{1cm}{#2}\end{indented}}
+
+% Void type
+\newcommand{\void}{{\it void}}
+
+% Typeset destructor
+\newcommand{\destruct}[1]{{$\sim$}#1}
+
+% Typeset insert/extract operators
+\newcommand{\cinsert}{$<<$}
+\newcommand{\cextract}{$>>$}
+
+
+% =================== Hypertext facilities ===================
+%
+% To insert hyperlinks (or references, in Latex), \label the sections
+% or membersections \label{ref-label} immediately after the section, on the same line,
+% and use \helpref{text-to-show}{ref-label} to make a reference.
+%
+
+% Type text with section reference
+\newcommand{\helpref}[2]{{\it #1} (p.\ \pageref{#2}) }
+
+% Type text with URL in verbatim mode
+\newcommand{\urlref}[2]{#1 (\verb$#2$)}
+
+% Don't typeset section number in LaTeX
+\newcommand{\helprefn}[2]{{\it #1}}
+
+% Like helpref, but popup text in WinHelp instead of hyperlinked
+\newcommand{\popref}[2]{{\it #1}}
+
+% Like footnote, but popup text.
+\newcommand{\footnotepopup}[2]{{\it #1}\footnote{#2}}
+
+% =================== On-line help specific macros ===================
+%
+
+% Global document font size/family, help only.
+\newcommand{\helpfontsize}[1]{}
+\newcommand{\helpfontfamily}[1]{}
+
+% Ignore in all on-line help
+\newcommand{\helpignore}[1]{#1}
+% Only print in all on-line help
+\newcommand{\helponly}[1]{}
+
+% Ignore in LaTeX
+\newcommand{\latexignore}[1]{}
+% Only print in LaTeX
+\newcommand{\latexonly}[1]{#1}
+
+% Ignore in linear RTF
+\newcommand{\rtfignore}[1]{#1}
+% Only print in linear RTF
+\newcommand{\rtfonly}[1]{}
+
+% Ignore in WinHelp RTF
+\newcommand{\winhelpignore}[1]{#1}
+% Only print in WinHelp RTF
+\newcommand{\winhelponly}[1]{}
+
+% Ignore in wxHelp
+\newcommand{\xlpignore}[1]{#1}
+% Only print in wxHelp
+\newcommand{\xlponly}[1]{}
+
+% Ignore in HTML
+\newcommand{\htmlignore}[1]{#1}
+% Only print in HTML
+\newcommand{\htmlonly}[1]{}
+
+% Input a file only for help system (binder thickness is not a limitation
+% in help systems!)
+\newcommand{\helpinput}[1]{}
+
+\newcommand{\rtfsp}{ } % Force a space in RTF, ignore in Latex
+
+% =================== Miscellaneous macros ===================
+%
+% Headings consistent with generated ones
+\newcommand{\myheading}[1]{\vspace*{25pt}
+\begin{flushleft}
+{\LARGE \bf #1}
+\end{flushleft}
+\vskip 20pt
+}
+
+% Heading with entry in contents page.
+\newcommand{\chapterheading}[1]{\myheading{#1}
+\addcontentsline{toc}{chapter}{#1}}
+
+\newcommand{\sectionheading}[1]{\myheading{#1}
+\addcontentsline{toc}{section}{#1}}
+
+% Glossary environment
+\newenvironment{helpglossary}{\newpage\chapterheading{Glossary}\begin{description}}{\end{description}}
+
+% Glossary entry
+\newcommand{\gloss}[1]{\item[#1]\index{#1}}
+
+% Image: EPS in Latex, BMP or MF (whatever's available) in RTF. Requires psbox.
+\newcommand{\image}[2]{\psboxto(#1){#2}}
+
+% Image, left aligned (HTML)
+\newcommand{\imager}[2]{\psboxto(#1){#2}}
+
+% Image, right aligned (HTML)
+\newcommand{\imagel}[2]{\psboxto(#1){#2}}
+
+% Imagemap: principally for HTML only. In Latex,
+% acts like \image.
+\newcommand{\imagemap}[3]{\psboxto(#1){#2}}
+
+% Headers and footers
+% \setheader{EvenPageLeft}{EvenPageCentre}{EvenPageRight}
+% {OddPageLeft}{OddPageCentre}{OddPageRight}
+\newcommand{\setheader}[6]{
+\lhead[\fancyplain{}{#1}]{\fancyplain{}{#4}}
+\chead[\fancyplain{}{#2}]{\fancyplain{}{#5}}
+\rhead[\fancyplain{}{#3}]{\fancyplain{}{#6}}
+}
+
+% \setfooter{EvenPageLeft}{EvenPageCentre}{EvenPageRight}
+% {OddPageLeft}{OddPageCentre}{OddPageRight}
+\newcommand{\setfooter}[6]{
+\lfoot[\fancyplain{#1}{#1}]{\fancyplain{#4}{#4}}
+\cfoot[\fancyplain{#2}{#2}]{\fancyplain{#5}{#5}}
+\rfoot[\fancyplain{#3}{#3}]{\fancyplain{#6}{#6}}
+}
+
+% Needed for telling RTF where margin paragraph should go
+% in mirrored margins mode.
+\newcommand{\marginpareven}[1]{\hspace*{0pt}\marginpar{#1}}
+\newcommand{\marginparodd}[1]{\hspace*{0pt}\marginpar{#1}}
+
+% Environment for two-column table popular in WinHelp and manuals.
+\newcommand{\twocolwidtha}[1]{\def\twocolwidthaval{#1}}
+\newcommand{\twocolwidthb}[1]{\def\twocolwidthbval{#1}}
+\newcommand{\twocolspacing}[1]{\def\twocolspacingval{#1}}
+
+\twocolwidtha{3cm}
+\twocolwidthb{8.5cm}
+\twocolspacing{2}
+
+\newcommand{\twocolitem}[2]{#1 & #2\\}
+\newcommand{\twocolitemruled}[2]{#1 & #2\\\hline}
+
+\newenvironment{twocollist}{\renewcommand{\arraystretch}{\twocolspacingval}\begin{tabular}{lp{\twocolwidthbval}}}%
+{\end{tabular}\renewcommand{\arraystretch}{1}}
+
+% Specifying table rows for RTF compatibility
+\newcommand{\row}[1]{#1\\}
+
+% Use for the last ruled row for correct RTF generation.
+\newcommand{\ruledrow}[1]{#1\\\hline}
+
+% Indentation environment. Arg1 is left margin size
+\newenvironment{indented}[1]{\begin{list}{}{\leftmargin=#1}\item[]}%
+{\end{list}}
+
+% Framed box of text, normal formatting.
+\newcommand{\normalbox}[1]{\fbox{\vbox{#1}}}
+% Double-framed box of text.
+\newcommand{\normalboxd}[1]{\fbox{\fbox{\vbox{#1}}}}
+
+% WITHDRAWN -- can't do in RTF, easily.
+% Framed box of text, horizontally centred. Ragged right within box.
+% \newcommand{\centeredbox}[2]{\begin{center}\fbox{\parbox{#1}{\raggedright#2}}\end{center}}
+% Double-framed box of text, horizontally centred. Ragged right within box.
+% \newcommand{\centeredboxd}[2]{\begin{center}\fbox{\fbox{\parbox{#1}{\raggedright#2}}}\end{center}}
+
+% toocomplex environment: simply prints the argument in LaTeX,
+% comes out verbatim in all generated formats.
+\newenvironment{toocomplex}{}{}
+
+% Colour: dummy commands since LaTeX doesn't support colour.
+% \definecolour{name}{red}{blue}{green}
+% \fcol{name}{text} ; Foreground
+% \bcol{name}{text} ; Background
+\newcommand{\definecolour}[4]{}
+\newcommand{\definecolor}[4]{}
+\newcommand{\fcol}[2]{#2}
+\newcommand{\bcol}[2]{#2}
+\newcommand{\sethotspotcolour}[1]{}
+\newcommand{\sethotspotunderline}[1]{}
+\newcommand{\settransparency}[1]{}
+\newcommand{\backslashraw}[0]{}
+\newcommand{\lbraceraw}[0]{}
+\newcommand{\rbraceraw}[0]{}
+\newcommand{\registered}[0]{(r)}
+\newcommand{\background}[1]{}
+\newcommand{\textcolour}[1]{}
+\newcommand{\overview}[2]{See \helpref{#1}{#2}.}
+\newcommand{\docparam}[2]{{\it #1}\begin{list}{}{\leftmargin=1cm}\item[]
+#2%
+\end{list}}
+\newcommand{\wxheading}[1]{{\bf #1}}
+\newcommand{\const}[0]{{\bf const}}
+\newcommand{\constfunc}[3]{{\bf #1} {\bf #2}(#3) {\bf const}\index{#2}}
+\newcommand{\windowstyle}[1]{{\bf #1}\index{#1}}
+
+\addtolength{\textwidth}{1in}
+\addtolength{\oddsidemargin}{-0.5in}
+\addtolength{\topmargin}{-0.5in}
+\addtolength{\textheight}{1in}
+\sloppy
+
--- /dev/null
+\chapter{Topic overviews}
+\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}
+
+The following sections describe particular topics.
+
+\section{OGL overview}\label{ogloverview}
+
+\helpref{wxShapeCanvas}{wxshapecanvas}, derived from {\bf wxCanvas}, is the drawing area
+for a number of \helpref{wxShape}{wxshape} instances. Everything drawn on a
+wxShapeCanvas is derived from wxShape, which provides virtual
+member functions for redrawing, creating and destroying
+resize/selection `handles', movement and erasing behaviour, mouse
+click behaviour, calculating the bounding box of the shape, linking
+nodes with arcs, and so on.
+
+The way a client application copes with `damage' to the canvas is to
+erase (white out) anything should no longer be displayed, redraw the shape,
+and then redraw everything on the canvas to repair any damage. If quick edit
+mode is on for the canvas, the complete should be omitted by OGL and the
+application.
+
+Selection handles (called control points in the code) are implemented as
+wxRectangleShapes.
+
+Events are passed to shapes by the canvas in a high-level form, for example {\bf OnLeftClick},
+{\bf OnBeginDragLeft}, {\bf OnDragLeft}, {\bf OnEndDragLeft}. The canvas decides
+what is a click and what is a drag, whether it is on a shape or the canvas itself,
+and (by interrogating the shape) which attachment point the click is associated with.
+
+In order to provide event-handling flexibility, each shapes has an `event handler' associated with it,
+which by default is the shape itself (all shapes derive from wxShapeEvtHandler).
+An application can modify the event-handling behaviour simply by plugging a new
+event handler into the shape. This can avoid the need for multiple inheritance when
+new properties and behaviour are required for a number of different shape classes: instead
+of overriding each class, one new event handler class can be defined and used for all
+existing shape classes.
+
+A range of shapes have been predefined in the library, including rectangles, ellipses,
+polygons. A client application can derive from these shapes and/or derive entirely
+new shapes from wxShape.
+
+Instances of a class called \helpref{wxDiagram}{wxdiagram} organise collections of
+shapes, providing default file input and output behaviour.
+
+\section{wxDividedShape overview}\label{dividedshapeoverview}
+
+Classes: \helpref{wxDividedShape}{wxdividedshape}
+
+A wxDividedShape is a rectangle with a number of vertical divisions. Each
+division may have its text formatted with independent characteristics, and
+the size of each division relative to the whole image may be specified.
+
+Once a wxDividedShape has been created, the user may move the divisions with the
+mouse. By pressing Ctrl while right-clicking, the region attributes can be edited.
+
+Here are examples of creating wxDividedShape objects:
+
+{\small
+\begin{verbatim}
+ /*
+ * Divided rectangle with 3 regions
+ *
+ */
+
+ wxDividedShape *dividedRect = new wxDividedShape(50, 60);
+
+ wxShapeRegion *region = new wxShapeRegion;
+ region->SetProportions(0.0, 0.25);
+ dividedRect->AddRegion(region);
+
+ region = new wxShapeRegion;
+ region->SetProportions(0.0, 0.5);
+ dividedRect->AddRegion(region);
+
+ region = new wxShapeRegion;
+ region->SetProportions(0.0, 0.25);
+ dividedRect->AddRegion(region);
+
+ dividedRect->SetSize(50, 60); // Allow it to calculate region sizes
+ dividedRect->SetPen(wxBLACK_PEN);
+ dividedRect->SetBrush(wxWHITE_BRUSH);
+ dividedRect->Show(TRUE);
+ dividedRect->NameRegions();
+
+ /*
+ * Divided rectangle with 3 regions, rounded
+ *
+ */
+
+ wxDividedShape *dividedRect3 = new wxDividedShape(50, 60);
+ dividedRect3->SetCornerRadius(-0.4);
+
+ region = new wxShapeRegion;
+ region->SetProportions(0.0, 0.25);
+ dividedRect3->AddRegion(region);
+
+ region = new wxShapeRegion;
+ region->SetProportions(0.0, 0.5);
+ dividedRect3->AddRegion(region);
+
+ region = new wxShapeRegion;
+ region->SetProportions(0.0, 0.25);
+ dividedRect3->AddRegion(region);
+
+ dividedRect3->SetSize(50, 60); // Allow it to calculate region sizes
+ dividedRect3->SetPen(wxBLACK_PEN);
+ dividedRect3->SetBrush(wxWHITE_BRUSH);
+ dividedRect3->Show(TRUE);
+ dividedRect3->NameRegions();
+\end{verbatim}
+}
+
+\section{wxCompositeShape overview}\label{compositeshapeoverview}
+
+Classes: \helpref{wxCompositeShape}{wxcompositeshape}, \helpref{wxOGLConstraint}{wxoglconstraint}
+
+The wxCompositeShape allows fairly complex shapes to be created, and maintains
+a set of constraints which specify the layout and proportions of child shapes.
+
+Add child shapes to a wxCompositeShape using \helpref{AddChild}{wxcompositeshapeaddchild}, and
+add constraints using \helpref{AddConstraint}{wxcompositeshapeaddconstraint}.
+
+After children and shapes have been added, call \helpref{Recompute}{wxcompositeshaperecompute} which
+will return TRUE is the constraints could be satisfied, FALSE otherwise. If
+constraints have been correctly and consistently specified, this call will succeed.
+
+If there is more than one child, constraints must be specified: OGL cannot calculate
+the size and position of children otherwise. Don't assume that children will simply
+move relative to the parent without the use of constraints.
+
+To specify a constraint, you need three things:
+
+\begin{enumerate}\itemsep=0pt
+\item a constraint type, such as gyCONSTRAINT\_CENTRED\_VERTICALLY;
+\item a reference shape, with respect to which other shapes are going to be positioned - the\rtfsp
+{\it constraining} shape;
+\item a list of one or more shapes to be constrained: the {\it constrained} shapes.
+\end{enumerate}
+
+The constraining shape can be either the parent of the constrained shapes, or a sibling. The
+constrained shapes must all be siblings of each other.
+
+For an exhaustive list and description of the available constraint types, see the \helpref{wxOGLConstraint constructor}{wxoglconstraintconstr}.
+Note that most constraints operate in one dimension only (vertically or horizontally), so you will
+usually need to specify constraints in pairs.
+
+You can set the spacing between constraining and constrained shapes by
+calling \helpref{wxOGLConstraint::SetSpacing}{wxoglconstraintsetspacing}.
+
+Finally, a wxCompositeShape can have {\it divisions}, which are special child shapes of class
+wxDivisionShape (not to be confused with wxDividedShape). The purpose of this is to allow
+the composite to be divided into user-adjustable regions (divisions) into which other shapes
+can be dropped dynamically, given suitable application code. Divisons allow the child
+shapes to have an identity of their own - they can be manipulated independently of their container -
+but to behave as if they are contained with the division, moving with the parent shape.
+Divisions boundaries can themselves be moved using the mouse.
+
+To create an initial division, call \helpref{wxCompositeShape::MakeContainer}{wxcompositeshapemakecontainer}.
+Make further divisions by calling \helpref{wxDivisionShape::Divide}{wxdivisionshapedivide}.
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/vidbase.h at 26/Feb/00 14:51:56
+%
+
+\section{\class{wxVideoBaseDriver}}\label{wxvideobasedriver}
+
+Classes definition
+
+\wxheading{Derived from}
+
+\helpref{wxObject}{wxobject}
+
+\wxheading{Data structures}
+
+{\small \begin{verbatim}
+typedef enum {
+ wxVIDEO\_MSAVI,
+ wxVIDEO\_MPEG,
+ wxVIDEO\_QT,
+ wxVIDEO\_GIF,
+ wxVIDEO\_JMOV,
+ wxVIDEO\_FLI,
+ wxVIDEO\_IFF,
+ wxVIDEO\_SGI,
+ wxVIDEO\_MPEG2
+} wxVideoType
+\end{verbatim}}
+
+wxMMedia2 (video) types
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxVideoBaseDriver::wxVideoBaseDriver}\label{wxvideobasedriverwxvideobasedriver}
+
+\func{}{wxVideoBaseDriver}{\void}
+
+Ctors
+
+
+\membersection{wxVideoBaseDriver::wxVideoBaseDriver}\label{wxvideobasedriverwxvideobasedriver}
+
+\func{}{wxVideoBaseDriver}{\param{wxInputStream\& }{str}}
+
+
+\membersection{wxVideoBaseDriver::wxVideoBaseDriver}\label{wxvideobasedriverwxvideobasedriver}
+
+\func{}{wxVideoBaseDriver}{\param{const wxString\& }{filename}}
+
+
+\membersection{wxVideoBaseDriver::\destruct{wxVideoBaseDriver}}\label{wxvideobasedriverdtor}
+
+\func{}{\destruct{wxVideoBaseDriver}}{\void}
+
+Dtor
+
+
+\membersection{wxVideoBaseDriver::Play}\label{wxvideobasedriverplay}
+
+\func{bool}{Play}{\void}
+
+Usual functions ... They all return FALSE in case of errors.
+
+
+\membersection{wxVideoBaseDriver::Stop}\label{wxvideobasedriverstop}
+
+\func{bool}{Stop}{\void}
+
+
+\membersection{wxVideoBaseDriver::Pause}\label{wxvideobasedriverpause}
+
+\func{bool}{Pause}{\void}
+
+
+\membersection{wxVideoBaseDriver::Resume}\label{wxvideobasedriverresume}
+
+\func{bool}{Resume}{\void}
+
+
+\membersection{wxVideoBaseDriver::SetSize}\label{wxvideobasedriversetsize}
+
+\func{bool}{SetSize}{\param{wxSize }{size}}
+
+Size management
+
+
+\membersection{wxVideoBaseDriver::GetSize}\label{wxvideobasedrivergetsize}
+
+\constfunc{bool}{GetSize}{\param{wxSize\& }{size}}
+
+
+\membersection{wxVideoBaseDriver::IsCapable}\label{wxvideobasedriveriscapable}
+
+\constfunc{bool}{IsCapable}{\param{wxVideoType }{WXUNUSED(v\_type)}}
+
+Test the capability of the driver to handle the specified type
+
+
+\membersection{wxVideoBaseDriver::GetMovieCodec}\label{wxvideobasedrivergetmoviecodec}
+
+\constfunc{wxString}{GetMovieCodec}{\void}
+
+Return the video codec name
+
+
+\membersection{wxVideoBaseDriver::GetAudioCodec}\label{wxvideobasedrivergetaudiocodec}
+
+\constfunc{wxString}{GetAudioCodec}{\void}
+
+Return the audio codec name
+
+
+\membersection{wxVideoBaseDriver::GetSampleRate}\label{wxvideobasedrivergetsamplerate}
+
+\constfunc{wxUint32}{GetSampleRate}{\void}
+
+Return misc info about audio
+
+
+\membersection{wxVideoBaseDriver::GetChannels}\label{wxvideobasedrivergetchannels}
+
+\constfunc{wxUint8}{GetChannels}{\void}
+
+
+\membersection{wxVideoBaseDriver::GetBPS}\label{wxvideobasedrivergetbps}
+
+\constfunc{wxUint8}{GetBPS}{\void}
+
+
+\membersection{wxVideoBaseDriver::GetFrameRate}\label{wxvideobasedrivergetframerate}
+
+\constfunc{double}{GetFrameRate}{\void}
+
+Return frame rate
+
+
+\membersection{wxVideoBaseDriver::GetNbFrames}\label{wxvideobasedrivergetnbframes}
+
+\constfunc{wxUint32}{GetNbFrames}{\void}
+
+Return number of frames
+
+
+\membersection{wxVideoBaseDriver::OnFinished}\label{wxvideobasedriveronfinished}
+
+\func{void}{OnFinished}{\void}
+
+Called when the movie finished
+
+
+\membersection{wxVideoBaseDriver::AttachOutput}\label{wxvideobasedriverattachoutput}
+
+\func{bool}{AttachOutput}{\param{wxWindow\& }{output}}
+
+Attaches the video output to a window. The video will be shown in that window.
+
+
+\membersection{wxVideoBaseDriver::DetachOutput}\label{wxvideobasedriverdetachoutput}
+
+\func{void}{DetachOutput}{\void}
+
+
+\membersection{wxVideoBaseDriver::IsPaused}\label{wxvideobasedriverispaused}
+
+\constfunc{bool}{IsPaused}{\void}
+
+They return the state of the movie.
+
+
+\membersection{wxVideoBaseDriver::IsStopped}\label{wxvideobasedriverisstopped}
+
+\constfunc{bool}{IsStopped}{\void}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/vidwin.h at 26/Feb/00 14:52:03
+%
+
+
+\section{\class{wxVideoWindows}}\label{wxvideowindows}
+
+
+
+Class definition
+
+\wxheading{Derived from}
+
+\helpref{wxVideoBaseDriver}{wxvideobasedriver}
+
+\wxheading{Data structures}
+
+{\small \begin{verbatim}
+typedef struct VIDW\_Internal {
+ MCIDEVICEID m\_dev\_id
+\end{verbatim}}
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxVideoWindows::OpenFile}\label{wxvideowindowsopenfile}
+
+\func{void}{OpenFile}{\void}
+
+
+\membersection{wxVideoWindows::wxVideoWindows}\label{wxvideowindowswxvideowindows}
+
+\func{}{wxVideoWindows}{\void}
+
+
+\membersection{wxVideoWindows::wxVideoWindows}\label{wxvideowindowswxvideowindows}
+
+\func{}{wxVideoWindows}{\param{wxInputStream\& }{str}}
+
+
+\membersection{wxVideoWindows::wxVideoWindows}\label{wxvideowindowswxvideowindows}
+
+\func{}{wxVideoWindows}{\param{const wxString\& }{fname}}
+
+
+\membersection{wxVideoWindows::\destruct{wxVideoWindows}}\label{wxvideowindowsdtor}
+
+\func{}{\destruct{wxVideoWindows}}{\void}
+
+
+\membersection{wxVideoWindows::Play}\label{wxvideowindowsplay}
+
+\func{bool}{Play}{\void}
+
+
+\membersection{wxVideoWindows::Stop}\label{wxvideowindowsstop}
+
+\func{bool}{Stop}{\void}
+
+
+\membersection{wxVideoWindows::Pause}\label{wxvideowindowspause}
+
+\func{bool}{Pause}{\void}
+
+
+\membersection{wxVideoWindows::Resume}\label{wxvideowindowsresume}
+
+\func{bool}{Resume}{\void}
+
+
+\membersection{wxVideoWindows::GetSize}\label{wxvideowindowsgetsize}
+
+\constfunc{bool}{GetSize}{\param{wxSize\& }{size}}
+
+
+\membersection{wxVideoWindows::SetSize}\label{wxvideowindowssetsize}
+
+\func{bool}{SetSize}{\param{wxSize }{size}}
+
+
+\membersection{wxVideoWindows::GetMovieCodec}\label{wxvideowindowsgetmoviecodec}
+
+\constfunc{wxString}{GetMovieCodec}{\void}
+
+Return codec name for each stream.
+
+
+\membersection{wxVideoWindows::GetAudioCodec}\label{wxvideowindowsgetaudiocodec}
+
+\constfunc{wxString}{GetAudioCodec}{\void}
+
+
+\membersection{wxVideoWindows::GetSampleRate}\label{wxvideowindowsgetsamplerate}
+
+\constfunc{wxUint32}{GetSampleRate}{\void}
+
+Return misc. info about audio
+
+
+\membersection{wxVideoWindows::GetChannels}\label{wxvideowindowsgetchannels}
+
+\constfunc{wxUint8}{GetChannels}{\void}
+
+
+\membersection{wxVideoWindows::GetBPS}\label{wxvideowindowsgetbps}
+
+\constfunc{wxUint8}{GetBPS}{\void}
+
+
+\membersection{wxVideoWindows::GetFrameRate}\label{wxvideowindowsgetframerate}
+
+\constfunc{double}{GetFrameRate}{\void}
+
+Return the frame rate of the video (in frames/second)
+
+
+\membersection{wxVideoWindows::GetNbFrames}\label{wxvideowindowsgetnbframes}
+
+\constfunc{wxUint32}{GetNbFrames}{\void}
+
+Return the total number of frames in the movie
+
+
+\membersection{wxVideoWindows::IsCapable}\label{wxvideowindowsiscapable}
+
+\func{bool}{IsCapable}{\param{wxVideoType }{v\_type}}
+
+
+\membersection{wxVideoWindows::AttachOutput}\label{wxvideowindowsattachoutput}
+
+\func{bool}{AttachOutput}{\param{wxWindow\& }{output}}
+
+
+\membersection{wxVideoWindows::DetachOutput}\label{wxvideowindowsdetachoutput}
+
+\func{void}{DetachOutput}{\void}
+
+
+\membersection{wxVideoWindows::IsPaused}\label{wxvideowindowsispaused}
+
+\constfunc{bool}{IsPaused}{\void}
+
+
+\membersection{wxVideoWindows::IsStopped}\label{wxvideowindowsisstopped}
+
+\constfunc{bool}{IsStopped}{\void}
+
--- /dev/null
+%
+% automatically generated by HelpGen from
+% /home/guilhem/PROJECTS/wxWindows/utils/wxMMedia2/lib/vidxanm.h at 26/Feb/00 14:52:06
+%
+
+
+\section{\class{wxVideoXANIM}}\label{wxvideoxanim}
+
+
+
+Class definition
+
+\wxheading{Derived from}
+
+\helpref{wxVideoBaseDriver}{wxvideobasedriver}
+
+\wxheading{Data structures}
+
+{\small \begin{verbatim}
+typedef struct wxXANIMinternal {
+ Display *xanim\_dpy
+\end{verbatim}}
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxVideoXANIM::wxVideoXANIM}\label{wxvideoxanimwxvideoxanim}
+
+\func{}{wxVideoXANIM}{\void}
+
+
+\membersection{wxVideoXANIM::wxVideoXANIM}\label{wxvideoxanimwxvideoxanim}
+
+\func{}{wxVideoXANIM}{\param{wxInputStream\& }{str}}
+
+
+\membersection{wxVideoXANIM::wxVideoXANIM}\label{wxvideoxanimwxvideoxanim}
+
+\func{}{wxVideoXANIM}{\param{const wxString\& }{filename}}
+
+
+\membersection{wxVideoXANIM::\destruct{wxVideoXANIM}}\label{wxvideoxanimdtor}
+
+\func{}{\destruct{wxVideoXANIM}}{\void}
+
+
+\membersection{wxVideoXANIM::Play}\label{wxvideoxanimplay}
+
+\func{bool}{Play}{\void}
+
+
+\membersection{wxVideoXANIM::Pause}\label{wxvideoxanimpause}
+
+\func{bool}{Pause}{\void}
+
+
+\membersection{wxVideoXANIM::Resume}\label{wxvideoxanimresume}
+
+\func{bool}{Resume}{\void}
+
+
+\membersection{wxVideoXANIM::Stop}\label{wxvideoxanimstop}
+
+\func{bool}{Stop}{\void}
+
+
+\membersection{wxVideoXANIM::SetVolume}\label{wxvideoxanimsetvolume}
+
+\func{bool}{SetVolume}{\param{wxUint8 }{vol}}
+
+
+\membersection{wxVideoXANIM::SetSize}\label{wxvideoxanimsetsize}
+
+\func{bool}{SetSize}{\param{wxSize }{size}}
+
+
+\membersection{wxVideoXANIM::GetSize}\label{wxvideoxanimgetsize}
+
+\constfunc{bool}{GetSize}{\param{wxSize\& }{size}}
+
+
+\membersection{wxVideoXANIM::GetMovieCodec}\label{wxvideoxanimgetmoviecodec}
+
+\constfunc{wxString}{GetMovieCodec}{\void}
+
+Return the video codec name
+
+
+\membersection{wxVideoXANIM::GetAudioCodec}\label{wxvideoxanimgetaudiocodec}
+
+\constfunc{wxString}{GetAudioCodec}{\void}
+
+Return the audio codec name
+
+
+\membersection{wxVideoXANIM::GetSampleRate}\label{wxvideoxanimgetsamplerate}
+
+\constfunc{wxUint32}{GetSampleRate}{\void}
+
+Return misc info about audio
+
+
+\membersection{wxVideoXANIM::GetChannels}\label{wxvideoxanimgetchannels}
+
+\constfunc{wxUint8}{GetChannels}{\void}
+
+
+\membersection{wxVideoXANIM::GetBPS}\label{wxvideoxanimgetbps}
+
+\constfunc{wxUint8}{GetBPS}{\void}
+
+
+\membersection{wxVideoXANIM::GetFrameRate}\label{wxvideoxanimgetframerate}
+
+\constfunc{double}{GetFrameRate}{\void}
+
+Return frame rate
+
+
+\membersection{wxVideoXANIM::GetNbFrames}\label{wxvideoxanimgetnbframes}
+
+\constfunc{wxUint32}{GetNbFrames}{\void}
+
+Return number of frames in the movie
+
+
+\membersection{wxVideoXANIM::IsCapable}\label{wxvideoxanimiscapable}
+
+\constfunc{bool}{IsCapable}{\param{wxVideoType }{v\_type}}
+
+
+\membersection{wxVideoXANIM::AttachOutput}\label{wxvideoxanimattachoutput}
+
+\func{bool}{AttachOutput}{\param{wxWindow\& }{output}}
+
+
+\membersection{wxVideoXANIM::DetachOutput}\label{wxvideoxanimdetachoutput}
+
+\func{void}{DetachOutput}{\void}
+
+
+\membersection{wxVideoXANIM::IsPaused}\label{wxvideoxanimispaused}
+
+\constfunc{bool}{IsPaused}{\void}
+
+
+\membersection{wxVideoXANIM::IsStopped}\label{wxvideoxanimisstopped}
+
+\constfunc{bool}{IsStopped}{\void}
+
+
+\membersection{wxVideoXANIM::RestartXANIM}\label{wxvideoxanimrestartxanim}
+
+\func{bool}{RestartXANIM}{\void}
+
+Start the subprocess with the right parameters
+
+
+\membersection{wxVideoXANIM::SendCommand}\label{wxvideoxanimsendcommand}
+
+\func{bool}{SendCommand}{\param{const char* }{command}, \param{char** }{ret = NULL}, \param{wxUint32* }{size = NULL}}
+
+Send a command to the subprocess
+
+
+\membersection{wxVideoXANIM::CollectInfo}\label{wxvideoxanimcollectinfo}
+
+\func{bool}{CollectInfo}{\void}
+
+Collect informations from XAnim
+
--- /dev/null
+// ---------------------------------------------------------------------------
+// Name: cdbase.h
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: 1997
+// Updated: 1998, 1999, 2000
+// Copyright: (C) 1997, 1998, 1999, 2000 Guilhem Lavaux
+// License: wxWindows license
+// ---------------------------------------------------------------------------
+#ifndef __CDA_base_H__
+#define __CDA_base_H__
+
+#ifdef __GNUG__
+#pragma interface "cdbase.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/object.h"
+
+typedef struct wxCDtime {
+ wxUint8 track;
+ wxUint8 hour, min, sec;
+} wxCDtime;
+
+class WXDLLEXPORT wxCDAudio : public wxObject {
+ DECLARE_ABSTRACT_CLASS(wxCDAudio)
+public:
+ typedef enum { PLAYING, PAUSED, STOPPED } CDstatus;
+ // Table of contents manager
+ class CDtoc {
+ protected:
+ wxCDtime *tracks_time, *tracks_pos;
+ wxCDtime total_time;
+ public:
+ //
+ CDtoc(wxCDtime& tot_tm, wxCDtime *trks_tm, wxCDtime *trks_pos)
+ { tracks_time = trks_tm; total_time = tot_tm; tracks_pos = trks_pos; }
+
+ // Returns the length of the specified track
+ // track: track to get length
+ wxCDtime GetTrackTime(wxUint8 track) const;
+ // Returns the position of the specified track
+ // track: track to get position
+ wxCDtime GetTrackPos(wxUint8 track) const;
+ // Returns the total time
+ inline wxCDtime GetTotalTime() const { return total_time; }
+ };
+public:
+ //
+ wxCDAudio() : wxObject() {}
+ //
+ virtual ~wxCDAudio() {}
+
+ // Play audio at the specified position
+ virtual bool Play(const wxCDtime& beg_play, const wxCDtime& end_play) = 0;
+ // Play audio from the specified to the end of the CD audio
+ bool Play(const wxCDtime& beg_play);
+ //
+ bool Play(wxUint8 beg_track, wxUint8 end_track = 0);
+ // Pause the audio playing
+ virtual bool Pause() = 0;
+ // Resume a paused audio playing
+ virtual bool Resume() = 0;
+ // Get the current CD status
+ virtual CDstatus GetStatus() = 0;
+ // Get the current playing time
+ virtual wxCDtime GetTime() = 0;
+ // Returns the table of contents
+ virtual const CDtoc& GetToc() = 0;
+ // CD ok
+ virtual bool Ok() const = 0;
+};
+
+#endif
--- /dev/null
+// ---------------------------------------------------------------------------
+// Name: cdunix.h
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: 1997
+// Updated: 2000
+// Copyright: (C) 1997, 1998, 1999, 2000 Guilhem Lavaux
+// License: wxWindows license
+// ---------------------------------------------------------------------------
+#ifndef __CDUNIXH__
+#define __CDUNIXH__
+
+#ifdef __GNUG__
+#pragma interface "cdunix.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/object.h"
+#include "wx/string.h"
+#include "wx/mmedia/cdbase.h"
+
+///
+class WXDLLEXPORT wxCDAudioLinux : public wxCDAudio {
+ DECLARE_DYNAMIC_CLASS(wxCDAudioLinux)
+protected:
+ wxCDtime m_time;
+ CDstatus m_status;
+ CDtoc *m_toc;
+ int m_fd;
+ wxCDtime *m_trksize, *m_trkpos;
+public:
+ ///
+ wxCDAudioLinux();
+ ///
+ wxCDAudioLinux(const wxString& dev_name);
+ ///
+ virtual ~wxCDAudioLinux();
+
+ ///
+ virtual bool Play(const wxCDtime& beg_time, const wxCDtime& end_time);
+ ///
+ virtual bool Pause();
+ ///
+ virtual bool Resume();
+ ///
+ virtual CDstatus GetStatus();
+ ///
+ virtual wxCDtime GetTime();
+ ///
+ virtual CDtoc& GetToc();
+ ///
+ virtual inline bool Ok() const { return (m_fd != -1); }
+protected:
+ ///
+ void OpenDevice(const wxString& dev_name);
+};
+
+#endif
--- /dev/null
+// /////////////////////////////////////////////////////////////////////////////
+// Name: cdwin.h
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: 1997
+// Updated: 1998
+// Copyright: (C) 1997, 1998, Guilhem Lavaux
+// License: wxWindows license
+// /////////////////////////////////////////////////////////////////////////////
+#ifndef __CDA_win_H__
+#define __CDA_win_H__
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include "wx/wxprec.h"
+#include "cdbase.h"
+
+#ifdef WXMMEDIA_INTERNAL
+#include <windows.h>
+#include <mmsystem.h>
+typedef struct CDAW_Internal {
+ MCIDEVICEID dev_id;
+} CDAW_Internal;
+#endif
+
+///
+class WXDLLEXPORT wxCDAudioWin : public wxCDAudio {
+ DECLARE_DYNAMIC_CLASS(wxCDAudioWin)
+protected:
+ struct CDAW_Internal *m_internal;
+ wxCDtime *m_trksize, *m_trkpos;
+ CDtoc *m_toc;
+ bool m_ok;
+public:
+ ///
+ wxCDAudioWin(void);
+ ///
+ wxCDAudioWin(const char *dev_name);
+ ///
+ virtual ~wxCDAudioWin(void);
+
+ ///
+ virtual bool Play(const wxCDtime& beg_time, const wxCDtime& end_time);
+ ///
+ virtual bool Pause(void);
+ ///
+ virtual bool Resume(void);
+ ///
+ virtual CDstatus GetStatus(void);
+ ///
+ virtual wxCDtime GetTime(void);
+ ///
+ virtual const CDtoc& GetToc(void);
+ ///
+ virtual inline bool Ok(void) const { return m_ok; }
+protected:
+ void PrepareToc();
+};
+
+#endif
--- /dev/null
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use. Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ */
+
+/*
+ * g72x.h
+ *
+ * Header file for CCITT conversion routines.
+ *
+ */
+#ifndef _G72X_H
+#define _G72X_H
+
+#define AUDIO_ENCODING_ULAW (1) /* ISDN u-law */
+#define AUDIO_ENCODING_ALAW (2) /* ISDN A-law */
+#define AUDIO_ENCODING_LINEAR (3) /* PCM 2's-complement (0-center) */
+
+/*
+ * The following is the definition of the state structure
+ * used by the G.721/G.723 encoder and decoder to preserve their internal
+ * state between successive calls. The meanings of the majority
+ * of the state structure fields are explained in detail in the
+ * CCITT Recommendation G.721. The field names are essentially indentical
+ * to variable names in the bit level description of the coding algorithm
+ * included in this Recommendation.
+ */
+struct g72x_state {
+ long yl; /* Locked or steady state step size multiplier. */
+ short yu; /* Unlocked or non-steady state step size multiplier. */
+ short dms; /* Short term energy estimate. */
+ short dml; /* Long term energy estimate. */
+ short ap; /* Linear weighting coefficient of 'yl' and 'yu'. */
+
+ short a[2]; /* Coefficients of pole portion of prediction filter. */
+ short b[6]; /* Coefficients of zero portion of prediction filter. */
+ short pk[2]; /*
+ * Signs of previous two samples of a partially
+ * reconstructed signal.
+ */
+ short dq[6]; /*
+ * Previous 6 samples of the quantized difference
+ * signal represented in an internal floating point
+ * format.
+ */
+ short sr[2]; /*
+ * Previous 2 samples of the quantized difference
+ * signal represented in an internal floating point
+ * format.
+ */
+ char td; /* delayed tone detect, new in 1988 version */
+};
+
+/* External function definitions. */
+
+extern unsigned char linear2alaw (int pcm_val); /* 2's complement (16-bit range) */
+extern int alaw2linear (unsigned char a_val);
+extern unsigned char linear2ulaw (int pcm_val); /* 2's complement (16-bit range) */
+extern int ulaw2linear (unsigned char u_val);
+extern int predictor_zero (struct g72x_state *state_ptr);
+extern int predictor_pole (struct g72x_state *state_ptr);
+extern int step_size (struct g72x_state *state_ptr);
+extern int quantize (int d, int y, short *table, int size);
+extern int reconstruct (int sign, int dqln, int y);
+
+extern void update
+ ( int code_size, int y, int wi, int fi, int dq
+ , int sr, int dqsez, struct g72x_state *state_ptr);
+
+int tandem_adjust_alaw
+ (int sr, int se, int y, int i, int sign, short *qtab);
+
+int tandem_adjust_ulaw
+ (int sr, int se, int y, int i, int sign, short *qtab);
+
+extern void g72x_init_state (struct g72x_state *);
+extern int g721_encoder(
+ int sample,
+ int in_coding,
+ struct g72x_state *state_ptr);
+extern int g721_decoder(
+ int code,
+ int out_coding,
+ struct g72x_state *state_ptr);
+extern int g723_24_encoder(
+ int sample,
+ int in_coding,
+ struct g72x_state *state_ptr);
+extern int g723_24_decoder(
+ int code,
+ int out_coding,
+ struct g72x_state *state_ptr);
+extern int g723_40_encoder(
+ int sample,
+ int in_coding,
+ struct g72x_state *state_ptr);
+extern int g723_40_decoder(
+ int code,
+ int out_coding,
+ struct g72x_state *state_ptr);
+
+#endif /* !_G72X_H */
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndaiff.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDAIFF_H
+#define _WX_SNDAIFF_H
+
+#ifdef __GNUG__
+#pragma interface "sndaiff.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/stream.h"
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndcodec.h"
+#include "wx/mmedia/sndfile.h"
+
+//
+// AIFF codec
+//
+
+class wxSoundAiff: public wxSoundFileStream {
+public:
+ wxSoundAiff(wxInputStream& stream, wxSoundStream& io_sound);
+ wxSoundAiff(wxOutputStream& stream, wxSoundStream& io_sound);
+ ~wxSoundAiff();
+
+ bool CanRead();
+ wxString GetCodecName() const;
+
+protected:
+ bool PrepareToPlay();
+ bool PrepareToRecord(wxUint32 time);
+ bool FinishRecording();
+ bool RepositionStream(wxUint32 position);
+
+ wxUint32 GetData(void *buffer, wxUint32 len);
+ wxUint32 PutData(const void *buffer, wxUint32 len);
+protected:
+ off_t m_base_offset;
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndbase.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDBASE_H
+#define _WX_SNDBASE_H
+
+#ifdef __GNUG__
+#pragma interface "sndbase.h"
+#endif
+
+#include "wx/defs.h"
+
+// ------------------------------------------------------------------------
+// DEFINITIONS
+
+// ---------------------
+// Sound streaming mode:
+// - wxSOUND_INPUT: simple recording mode
+// - wxSOUND_OUTPUT: simple playing mode
+// - wxSOUND_DUPLEX: full duplex record/play at the same time
+// ---------------------
+enum {
+ wxSOUND_INPUT = 1,
+ wxSOUND_OUTPUT = 2,
+ wxSOUND_DUPLEX = wxSOUND_INPUT | wxSOUND_OUTPUT,
+};
+
+// ---------------------
+// wxSoundFormatType: it specifies the format family of the sound data
+// which will be passed to the stream.
+// ---------------------
+typedef enum {
+ wxSOUND_NOFORMAT,
+ wxSOUND_PCM,
+ wxSOUND_ULAW,
+ wxSOUND_G72X,
+ wxSOUND_MSADPCM
+} wxSoundFormatType;
+
+// ---------------------
+// wxSoundError:
+// - wxSOUND_NOERR: No error occured
+// - wxSOUND_IOERR: an input/output error occured, it may concern either
+// a driver or a file
+// - wxSOUND_INVFRMT: the sound format passed to the function is invalid.
+// Generally, it means that you passed out of range values
+// to the codec stream or you don't pass the right sound
+// format object to the right sound codec stream.
+// - wxSOUND_INVDEV: Invalid device. Generally, it means that the sound stream
+// didn't manage to open the device driver due to an invalid// parameter or to the fact that sound is not supported on
+// this computer.
+// - wxSOUND_NOEXACT: No exact matching sound codec has been found for
+// this sound format. It means that the sound driver didn't
+// manage to setup the sound card with the specified
+// values.
+// - wxSOUND_NOCODEC: No matching codec has been found. Generally, it
+// may happen when you call
+// wxSoundRouterStream::SetSoundFormat().
+// - wxSOUND_MEMERR: Not enough memory.
+// - wxSOUND_NOTSTARTED: You did not start the production using
+// StartProduction()
+// ---------------------
+typedef enum {
+ wxSOUND_NOERROR,
+ wxSOUND_IOERROR,
+ wxSOUND_INVFRMT,
+ wxSOUND_INVDEV,
+ wxSOUND_NOEXACT,
+ wxSOUND_INVSTRM,
+ wxSOUND_NOCODEC,
+ wxSOUND_MEMERROR,
+ wxSOUND_NOTSTARTED
+} wxSoundError;
+
+class WXDLLEXPORT wxSoundStream;
+
+// ---------------------
+// wxSoundCallback(stream, evt, cdata): C callback for sound event.
+// - stream: current wxSoundStream
+// - evt: the sound event which has occured, it may be wxSOUND_INPUT,
+// wxSOUND_OUTPUT or wxSOUND_DUPLEX
+// - cdata: User callback data
+// ---------------------
+typedef void (*wxSoundCallback)(wxSoundStream *stream, int evt,
+ void *cdata);
+
+//
+// Base class for sound format specification
+//
+
+class WXDLLEXPORT wxSoundFormatBase {
+ public:
+ wxSoundFormatBase();
+ virtual ~wxSoundFormatBase();
+
+ // It returns a "standard" format type.
+ virtual wxSoundFormatType GetType() const { return wxSOUND_NOFORMAT; }
+ // It clones the current format.
+ virtual wxSoundFormatBase *Clone() const;
+
+ virtual wxUint32 GetTimeFromBytes(wxUint32 bytes) const = 0;
+ virtual wxUint32 GetBytesFromTime(wxUint32 time) const = 0;
+
+ virtual bool operator !=(const wxSoundFormatBase& frmt2) const;
+};
+
+//
+// Base class for sound streams
+//
+
+class wxSoundStream {
+ public:
+ wxSoundStream();
+ virtual ~wxSoundStream();
+
+ // Reads "len" bytes from the sound stream.
+ virtual wxSoundStream& Read(void *buffer, wxUint32 len) = 0;
+ // Writes "len" byte to the sound stream.
+ virtual wxSoundStream& Write(const void *buffer, wxUint32 len) = 0;
+ // Returns the best size for IO calls
+ virtual wxUint32 GetBestSize() const { return 1024; }
+
+ // SetSoundFormat returns TRUE when the format can be handled.
+ virtual bool SetSoundFormat(const wxSoundFormatBase& format);
+
+ // GetSoundFormat returns the current sound format.
+ wxSoundFormatBase& GetSoundFormat() const { return *m_sndformat; }
+
+ // Register a callback for a specified async event.
+ void SetCallback(int evt, wxSoundCallback cbk, void *cdata);
+
+ // Starts the async notifier. After this call, the stream begins either
+ // recording or playing or the two at the same time.
+ virtual bool StartProduction(int evt) = 0;
+ // Stops the async notifier.
+ virtual bool StopProduction() = 0;
+ // Sets the event handler: if it is non-null, all events are routed to it.
+ void SetEventHandler(wxSoundStream *handler) { m_handler = handler; }
+
+ wxSoundError GetError() const { return m_snderror; }
+ wxUint32 GetLastAccess() const { return m_lastcount; }
+
+ // This is only useful for device (I think).
+ virtual bool QueueFilled() const { return TRUE; }
+
+ protected:
+ // Current sound format
+ wxSoundFormatBase *m_sndformat;
+
+ // Last error
+ wxSoundError m_snderror;
+
+ // Last access
+ wxUint32 m_lastcount;
+
+ // Event handler
+ wxSoundStream *m_handler;
+
+ wxSoundCallback m_callback[2];
+ void *m_cdata[2];
+
+ protected:
+ // Handles event
+ virtual void OnSoundEvent(int evt);
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndcodec.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDCODEC_H
+#define _WX_SNDCODEC_H
+
+#ifdef __GNUG__
+#pragma interface "sndcodec.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/mmedia/sndbase.h"
+
+class wxSoundStreamCodec: public wxSoundStream {
+ public:
+ wxSoundStreamCodec(wxSoundStream& snd_io);
+ ~wxSoundStreamCodec();
+
+ bool StartProduction(int evt);
+ bool StopProduction();
+
+ wxUint32 GetBestSize() const;
+
+ protected:
+ wxSoundStream *m_sndio;
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndcpcm.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDCPCM_H
+#define _WX_SNDCPCM_H
+
+#ifdef __GNUG__
+#pragma interface "sndcpcm.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndcodec.h"
+
+//
+// PCM converter class
+//
+
+class wxSoundStreamPcm: public wxSoundStreamCodec {
+public:
+ typedef void (*ConverterType)(const void *buf_in, void *buf_out,
+ wxUint32 len);
+
+ wxSoundStreamPcm(wxSoundStream& sndio);
+ ~wxSoundStreamPcm();
+
+ wxSoundStream& Read(void *buffer, wxUint32 len);
+ wxSoundStream& Write(const void *buffer, wxUint32 len);
+
+ bool SetSoundFormat(const wxSoundFormatBase& format);
+
+ wxUint32 GetBestSize() const;
+
+protected:
+ wxUint32 GetReadSize(wxUint32 len) const;
+ wxUint32 GetWriteSize(wxUint32 len) const;
+
+protected:
+ ConverterType m_function_out, m_function_in;
+
+ // Static temporary buffer
+ char *m_prebuffer;
+ wxUint32 m_prebuffer_size;
+ // Estimated best size to fit into the static buffer
+ wxUint32 m_best_size;
+ // Multiplier for IO buffer size
+ float m_multiplier_in, m_multiplier_out;
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndesd.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDESD_H
+#define _WX_SNDESD_H
+
+#ifdef __GNUG__
+#pragma interface "sndesd.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/string.h"
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndpcm.h"
+
+//
+// ESD output class
+//
+
+class wxSoundStreamESD : public wxSoundStream {
+public:
+ wxSoundStreamESD(const wxString& hostname = wxT("localhost"));
+ ~wxSoundStreamESD();
+
+ wxSoundStream& Read(void *buffer, wxUint32 len);
+ wxSoundStream& Write(const void *buffer, wxUint32 len);
+
+ bool SetSoundFormat(const wxSoundFormatBase& format);
+
+ bool StartProduction(int evt);
+ bool StopProduction();
+
+ // You should not call this.
+ void WakeUpEvt(int evt);
+
+ bool QueueFilled() const { return m_q_filled; }
+protected:
+ int m_fd_input, m_fd_output; // ESD fds
+ int m_tag_input, m_tag_output; // GLIB tags
+ bool m_esd_stop; // Stream started ?
+ bool m_esd_ok; // ESD detected
+ wxString m_hostname; // ESD host
+ bool m_q_filled; // queue filled
+
+private:
+ void DetectBest(wxSoundFormatPcm *pcm);
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndfile.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDFILE_H
+#define _WX_SNDFILE_H
+
+#include "wx/defs.h"
+#include "wx/stream.h"
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndcodec.h"
+
+#define wxSOUND_INFINITE_TIME ((wxUint32)-1)
+
+//
+// Codec router class
+//
+
+class WXDLLEXPORT wxSoundRouterStream: public wxSoundStreamCodec {
+ public:
+ wxSoundRouterStream(wxSoundStream& sndio);
+ ~wxSoundRouterStream();
+
+ wxSoundStream& Read(void *buffer, wxUint32 len);
+ wxSoundStream& Write(const void *buffer, wxUint32 len);
+
+ bool SetSoundFormat(const wxSoundFormatBase& format);
+
+ bool StartProduction(int evt);
+ bool StopProduction();
+
+ wxUint32 GetBestSize() const;
+
+ protected:
+ wxSoundStream *m_router;
+};
+
+typedef enum {
+ wxSOUND_FILE_STOPPED,
+ wxSOUND_FILE_PAUSED,
+ wxSOUND_FILE_PLAYING,
+ wxSOUND_FILE_RECORDING
+} wxSoundFileState;
+
+//
+// Base class for file coders/decoders
+//
+
+class wxSoundFileStream: public wxSoundStream {
+public:
+ wxSoundFileStream(wxInputStream& stream, wxSoundStream& io_sound);
+ wxSoundFileStream(wxOutputStream& stream, wxSoundStream& io_sound);
+ ~wxSoundFileStream();
+
+ // Usual sound file calls (Play, Stop, ...)
+ bool Play();
+ bool Record(wxUint32 time);
+ bool Stop();
+ bool Pause();
+ bool Resume();
+
+ // Functions which return the current state
+ bool IsStopped() const { return m_state == wxSOUND_FILE_STOPPED; }
+ bool IsPaused() const { return m_state == wxSOUND_FILE_PAUSED; }
+
+ // A user should not call these two functions.
+ // Several things must be done before calling them.
+ // Users should use Play(), ...
+ bool StartProduction(int evt);
+ bool StopProduction();
+
+ // These three functions deals with the length, the position in the sound file.
+ // All the values are expressed in bytes. If you need the values expressed
+ // in terms of time, you have to use GetSoundFormat().GetTimeFromBytes(...)
+ wxUint32 GetLength();
+ wxUint32 GetPosition();
+ wxUint32 SetPosition(wxUint32 new_position);
+
+ // These two functions use the sound format specified by GetSoundFormat().
+ // All samples must be encoded in that format.
+ wxSoundStream& Read(void *buffer, wxUint32 len);
+ wxSoundStream& Write(const void *buffer, wxUint32 len);
+
+ // This function set the sound format of the file. !! It must be used only
+ // when you are in output mode (concerning the file) !! If you are in
+ // input mode (concerning the file) you can't use this function to modify
+ // the format of the samples returned by Read() !
+ // For this action, you must use wxSoundRouterStream applied to wxSoundFileStream.
+ bool SetSoundFormat(const wxSoundFormatBase& format);
+
+ // This function returns the Codec name. This is useful for those who want to build
+ // a player (But also in some other case).
+ virtual wxString GetCodecName() const;
+
+ // You should use this function to test whether this file codec can read
+ // the stream you passed to it.
+ virtual bool CanRead() { return FALSE; }
+
+protected:
+ wxSoundRouterStream m_codec;
+ wxSoundStream *m_sndio;
+ wxInputStream *m_input;
+ wxOutputStream *m_output;
+
+ wxSoundFileState m_state, m_oldstate;
+ wxUint32 m_length, m_bytes_left;
+ bool m_prepared;
+
+protected:
+ virtual bool PrepareToPlay() = 0;
+ virtual bool PrepareToRecord(wxUint32 time) = 0;
+ virtual bool FinishRecording() = 0;
+ virtual bool RepositionStream(wxUint32 position) = 0;
+ void FinishPreparation(wxUint32 len);
+
+ virtual wxUint32 GetData(void *buffer, wxUint32 len) = 0;
+ virtual wxUint32 PutData(const void *buffer, wxUint32 len) = 0;
+
+ void OnSoundEvent(int evt);
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndg72x.h
+// Purpose:
+// Date: 08/26/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDG72X_H
+#define _WX_SNDG72X_H
+
+#ifdef __GNUG__
+#pragma interface "sndg72x.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndcodec.h"
+#include "wx/mmedia/sndbase.h"
+
+typedef enum {
+ wxSOUND_G721,
+ wxSOUND_G723_24,
+ wxSOUND_G723_40
+} wxSoundG72XType;
+
+// This fixes a bug in Mingw95
+typedef struct g72x_state g72state;
+
+//
+// G72X format
+//
+class WXDLLEXPORT wxSoundFormatG72X: public wxSoundFormatBase {
+ public:
+ wxSoundFormatG72X();
+ ~wxSoundFormatG72X();
+
+ void SetG72XType(wxSoundG72XType type);
+ wxSoundG72XType GetG72XType() const { return m_g72x_type; }
+
+ void SetSampleRate(wxUint32 srate);
+ wxUint32 GetSampleRate() const;
+
+ wxSoundFormatType GetType() const { return wxSOUND_G72X; }
+ wxSoundFormatBase *Clone() const;
+
+ wxUint32 GetTimeFromBytes(wxUint32 bytes) const;
+ wxUint32 GetBytesFromTime(wxUint32 time) const;
+
+ bool operator !=(const wxSoundFormatBase& frmt2) const;
+
+ protected:
+ wxUint32 m_srate;
+ wxSoundG72XType m_g72x_type;
+};
+
+//
+// ULAW converter class
+//
+
+class WXDLLEXPORT wxSoundRouterStream;
+class WXDLLEXPORT wxSoundStreamG72X: public wxSoundStreamCodec {
+ public:
+ wxSoundStreamG72X(wxSoundStream& sndio);
+ ~wxSoundStreamG72X();
+
+ wxSoundStream& Read(void *buffer, wxUint32 len);
+ wxSoundStream& Write(const void *buffer, wxUint32 len);
+
+ bool SetSoundFormat(const wxSoundFormatBase& format);
+
+ protected:
+ wxSoundRouterStream *m_router;
+ wxUint8 m_n_bits, m_current_mask, m_current_b_pos, m_current_byte;
+ wxUint8 *m_io_buffer;
+ g72state *m_state;
+
+ int (*m_coder)(int code, int in_code, struct g72x_state *state);
+ int (*m_decoder)(int code, int out_code, struct g72x_state *state);
+
+ protected:
+ void PutBits(wxUint8 bits);
+ wxUint8 GetBits();
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndmsad(pcm).h
+// Purpose: MS ADPCM codec
+// Date: 25/02/2000
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 2000
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDULAW_H
+#define _WX_SNDULAW_H
+
+#ifdef __GNUG__
+#pragma interface "sndmsad.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/dynarray.h"
+#include "wx/mmedia/sndcodec.h"
+#include "wx/mmedia/sndbase.h"
+
+WX_DEFINE_EXPORTED_ARRAY(wxUint16, wxMSAdpcmCoeffs);
+
+//
+// MSADPCM format
+//
+class WXDLLEXPORT wxSoundFormatMSAdpcm: public wxSoundFormatBase {
+ public:
+ wxSoundFormatMSAdpcm();
+ ~wxSoundFormatMSAdpcm();
+
+ void SetSampleRate(wxUint32 srate);
+ wxUint32 GetSampleRate() const;
+
+ void SetSamplesBlock(wxUint16 sampblock);
+ wxUint16 GetSamplesBlock() const;
+
+ void SetCoefs(wxMSAdpcmCoefs& coefs);
+ wxMSAdpcmCoefs& GetCoefs() const;
+
+ wxSoundFormatType GetType() const { return wxSOUND_ULAW; }
+ wxSoundFormatBase *Clone() const;
+
+ wxUint32 GetTimeFromBytes(wxUint32 bytes) const;
+ wxUint32 GetBytesFromTime(wxUint32 time) const;
+
+ bool operator !=(const wxSoundFormatBase& frmt2) const;
+
+ protected:
+ wxUint32 m_srate;
+ wxMSAdpcmCoefs *m_coefs;
+};
+
+//
+// MS ADPCM converter class
+//
+class WXDLLEXPORT wxSoundRouterStream;
+class WXDLLEXPORT wxSoundStreamAdpcm: public wxSoundStreamCodec {
+public:
+ wxSoundStreamAdpcm(wxSoundStream& sndio);
+ ~wxSoundStreamAdpcm();
+
+ wxSoundStream& Read(void *buffer, wxUint32 len);
+ wxSoundStream& Write(const void *buffer, wxUint32 len);
+
+ bool SetSoundFormat(const wxSoundFormatBase& format);
+
+ wxUint32 GetBestSize() const;
+
+protected:
+ wxSoundRouterStream *m_router;
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndoss.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDOSS_H
+#define _WX_SNDOSS_H
+
+#ifdef __GNUG__
+#pragma interface "sndoss.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/string.h"
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndpcm.h"
+
+//
+// OSS output class
+//
+
+class wxSoundStreamOSS : public wxSoundStream {
+ public:
+ wxSoundStreamOSS(const wxString& dev_name = wxT("/dev/dsp"));
+ ~wxSoundStreamOSS();
+
+ wxSoundStream& Read(void *buffer, wxUint32 len);
+ wxSoundStream& Write(const void *buffer, wxUint32 len);
+ wxUint32 GetBestSize() const;
+
+ bool SetSoundFormat(const wxSoundFormatBase& format);
+
+ bool StartProduction(int evt);
+ bool StopProduction();
+
+ bool QueueFilled() const;
+
+ // You should not call this.
+ void WakeUpEvt(int evt);
+ protected:
+ // OSS device
+ int m_fd;
+ wxUint32 m_bufsize;
+ int m_tag;
+ bool m_oss_stop, m_oss_ok, m_q_filled;
+ wxString m_devname;
+
+ private:
+ bool SetupFormat(wxSoundFormatPcm *pcm);
+ void DetectBest(wxSoundFormatPcm *pcm);
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndpcm.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDPCM_H
+#define _WX_SNDPCM_H
+
+#ifdef __GNUG__
+#pragma interface "sndpcm.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/mmedia/sndbase.h"
+
+//
+// PCM specification class
+//
+
+class wxSoundFormatPcm : public wxSoundFormatBase {
+public:
+ wxSoundFormatPcm(wxUint32 srate = 22500, wxUint8 bps = 8,
+ wxUint16 channels = 2, bool sign = TRUE,
+ int order = wxLITTLE_ENDIAN);
+ ~wxSoundFormatPcm();
+
+ void SetSampleRate(wxUint32 srate);
+ void SetBPS(wxUint8 bps);
+ void SetChannels(wxUint16 nchannels);
+ void SetOrder(int order);
+ void Signed(bool sign);
+
+ wxUint32 GetSampleRate() const { return m_srate; }
+ wxUint8 GetBPS() const { return m_bps; }
+ wxUint16 GetChannels() const { return m_nchan; }
+ int GetOrder() const { return m_order; }
+ bool Signed() const { return m_signed; }
+
+ wxSoundFormatType GetType() const { return wxSOUND_PCM; }
+ wxSoundFormatBase *Clone() const;
+
+ wxUint32 GetTimeFromBytes(wxUint32 bytes) const;
+ wxUint32 GetBytesFromTime(wxUint32 time) const;
+
+ bool operator!=(const wxSoundFormatBase& frmt2) const;
+
+protected:
+ wxUint32 m_srate;
+ wxUint8 m_bps;
+ wxUint16 m_nchan;
+ int m_order;
+ bool m_signed;
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndulaw.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDULAW_H
+#define _WX_SNDULAW_H
+
+#ifdef __GNUG__
+#pragma interface "sndulaw.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/mmedia/sndcodec.h"
+#include "wx/mmedia/sndbase.h"
+
+//
+// ULAW format
+//
+class WXDLLEXPORT wxSoundFormatUlaw: public wxSoundFormatBase {
+public:
+ wxSoundFormatUlaw();
+ ~wxSoundFormatUlaw();
+
+ void SetSampleRate(wxUint32 srate);
+ wxUint32 GetSampleRate() const;
+
+ void SetChannels(wxUint8 channels);
+ wxUint8 GetChannels() const;
+
+ wxSoundFormatType GetType() const { return wxSOUND_ULAW; }
+ wxSoundFormatBase *Clone() const;
+
+ wxUint32 GetTimeFromBytes(wxUint32 bytes) const;
+ wxUint32 GetBytesFromTime(wxUint32 time) const;
+
+ bool operator !=(const wxSoundFormatBase& frmt2) const;
+
+protected:
+ wxUint32 m_srate;
+ wxUint8 m_channels;
+};
+
+//
+// ULAW converter class
+//
+
+class WXDLLEXPORT wxSoundRouterStream;
+class WXDLLEXPORT wxSoundStreamUlaw: public wxSoundStreamCodec {
+public:
+ wxSoundStreamUlaw(wxSoundStream& sndio);
+ ~wxSoundStreamUlaw();
+
+ wxSoundStream& Read(void *buffer, wxUint32 len);
+ wxSoundStream& Write(const void *buffer, wxUint32 len);
+
+ bool SetSoundFormat(const wxSoundFormatBase& format);
+
+ wxUint32 GetBestSize() const;
+
+protected:
+ wxSoundRouterStream *m_router;
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndwav.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDWAV_H
+#define _WX_SNDWAV_H
+
+#ifdef __GNUG__
+#pragma interface "sndwav.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/string.h"
+#include "wx/stream.h"
+#include "wx/datstrm.h"
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndcodec.h"
+#include "wx/mmedia/sndfile.h"
+
+//
+// WAVE codec
+//
+
+class wxSoundWave: public wxSoundFileStream {
+public:
+ wxSoundWave(wxInputStream& stream, wxSoundStream& io_sound);
+ wxSoundWave(wxOutputStream& stream, wxSoundStream& io_sound);
+ ~wxSoundWave();
+
+ bool CanRead();
+ wxString GetCodecName() const;
+
+protected:
+ bool PrepareToPlay();
+ bool PrepareToRecord(wxUint32 time);
+ bool FinishRecording();
+ bool RepositionStream(wxUint32 position);
+
+ wxUint32 GetData(void *buffer, wxUint32 len);
+ wxUint32 PutData(const void *buffer, wxUint32 len);
+
+ bool HandleOutputPCM(wxDataInputStream& data, wxUint16 channels,
+ wxUint32 sample_fq, wxUint32 byte_p_sec,
+ wxUint16 byte_p_spl, wxUint16 bits_p_spl);
+ bool HandleOutputG721(wxDataInputStream& data, wxUint16 channels,
+ wxUint32 sample_fq, wxUint32 byte_p_sec,
+ wxUint16 byte_p_spl, wxUint16 bits_p_spl);
+ wxSoundFormatBase *HandleInputPCM(wxDataOutputStream& data);
+ wxSoundFormatBase *HandleInputG72X(wxDataOutputStream& data);
+
+protected:
+ off_t m_base_offset;
+};
+
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndwin.h
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifndef _WX_SNDWIN_H
+#define _WX_SNDWIN_H
+
+#include "wx/defs.h"
+#include "wx/mmedia/sndbase.h"
+
+typedef struct _wxSoundInternal wxSoundInternal;
+typedef struct _wxSoundInfoHeader wxSoundInfoHeader;
+
+class wxSoundInternal;
+class WXDLLEXPORT wxSoundStreamWin : public wxSoundStream {
+ public:
+ wxSoundStreamWin();
+ ~wxSoundStreamWin();
+
+ wxSoundStream& Write(const void *buffer, wxUint32 len);
+ wxSoundStream& Read(void *buffer, wxUint32 len);
+
+ bool SetSoundFormat(wxSoundFormatBase& base);
+
+ bool StartProduction(int evt);
+ bool StopProduction();
+
+ bool QueueFilled() const;
+
+ // Internal but defined as public
+ void NotifyDoneBuffer(wxUint32 dev_handle, int flag);
+
+ wxUint32 GetBestSize() const { return 4096; }
+
+ protected:
+ wxSoundInternal *m_internal;
+ wxUint32 m_current_frag_in, m_current_frag_out;
+ wxUint32 m_input_frag_in, m_output_frag_out;
+ wxSoundInfoHeader **m_headers_play, **m_headers_rec;
+
+ bool m_production_started, m_queue_filled, m_waiting_for;
+
+ protected:
+ void CreateSndWindow();
+ void DestroySndWindow();
+ bool OpenDevice(int mode);
+ void CloseDevice();
+
+ wxSoundInfoHeader *AllocHeader(int mode);
+ void FreeHeader(wxSoundInfoHeader *header, int mode);
+ bool AllocHeaders(int mode);
+ void FreeHeaders(int mode);
+
+ void WaitFor(wxSoundInfoHeader *info);
+ bool AddToQueue(wxSoundInfoHeader *info);
+ void ClearHeader(wxSoundInfoHeader *info);
+
+ wxSoundInfoHeader *NextFragmentOutput();
+ wxSoundInfoHeader *NextFragmentInput();
+};
+
+#endif
--- /dev/null
+// /////////////////////////////////////////////////////////////////////////////
+// Name: vidbase.h
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: 1997
+// Updated: 1998
+// Copyright: (C) 1997, 1998, Guilhem Lavaux
+// CVS: $Id$
+// License: wxWindows license
+// /////////////////////////////////////////////////////////////////////////////
+/* Real -*- C++ -*- */
+#ifndef __VID_bdrv_H__
+#define __VID_bdrv_H__
+
+#ifdef __GNUG__
+#pragma interface "vidbase.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// for all others, include the necessary headers (this file is usually all you
+// need because it includes almost all "standard" wxWindows headers
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+ #include "wx/stream.h"
+ #include "wx/string.h"
+ #include "wx/window.h"
+ #include "wx/frame.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// wxMMedia2 (video) types
+
+typedef enum {
+ wxVIDEO_MSAVI,
+ wxVIDEO_MPEG,
+ wxVIDEO_QT,
+ wxVIDEO_GIF,
+ wxVIDEO_JMOV,
+ wxVIDEO_FLI,
+ wxVIDEO_IFF,
+ wxVIDEO_SGI,
+ wxVIDEO_MPEG2
+} wxVideoType;
+
+// ----------------------------------------------------------------------------
+// Classes definition
+
+class WXDLLEXPORT wxVideoBaseDriver : public wxObject {
+ DECLARE_ABSTRACT_CLASS(wxVideoBaseDriver)
+protected:
+ wxWindow *m_video_output;
+public:
+ // Ctors
+ wxVideoBaseDriver();
+ wxVideoBaseDriver(wxInputStream& str);
+ wxVideoBaseDriver(const wxString& filename);
+ // Dtor
+ virtual ~wxVideoBaseDriver();
+
+ // Usual functions ... They all return FALSE in case of errors.
+ virtual bool Play() = 0;
+ virtual bool Stop() = 0;
+ virtual bool Pause() = 0;
+ virtual bool Resume() = 0;
+
+ // Size management
+ virtual bool SetSize(wxSize size) = 0;
+ virtual bool GetSize(wxSize& size) const = 0;
+
+ // Test the capability of the driver to handle the specified type
+ virtual bool IsCapable(wxVideoType WXUNUSED(v_type)) const { return FALSE; }
+
+ // Return the video codec name
+ virtual wxString GetMovieCodec() const = 0;
+ // Return the audio codec name
+ virtual wxString GetAudioCodec() const = 0;
+ // Return misc info about audio
+ virtual wxUint32 GetSampleRate() const = 0;
+ virtual wxUint8 GetChannels() const = 0;
+ virtual wxUint8 GetBPS() const = 0;
+ // Return frame rate
+ virtual double GetFrameRate() const = 0;
+ // Return number of frames
+ virtual wxUint32 GetNbFrames() const = 0;
+
+ // Called when the movie finished
+ virtual void OnFinished() {}
+
+ // Attaches the video output to a window. The video will be shown in that window.
+ virtual bool AttachOutput(wxWindow& output);
+ virtual void DetachOutput();
+
+ // They return the state of the movie.
+ virtual bool IsPaused() const = 0;
+ virtual bool IsStopped() const = 0;
+};
+
+WXDLLEXPORT wxFrame *wxVideoCreateFrame(wxVideoBaseDriver *vid_drv);
+
+
+#endif
--- /dev/null
+// ----------------------------------------------------------------------------
+// Name: vidwin.h
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: February 1998
+// Updated:
+// Copyright: (C) 1998, Guilhem Lavaux
+// License: wxWindows license
+// ----------------------------------------------------------------------------
+
+#ifndef __VID_windows_H__
+#define __VID_windows_H__
+
+#ifdef __GNUG__
+ #pragma interface "vidwin.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// for all others, include the necessary headers (this file is usually all you
+// need because it includes almost all "standard" wxWindows headers
+#ifndef WX_PRECOMP
+ #include "wx/string.h"
+ #include "wx/stream.h"
+ #include "wx/window.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// wxMMedia2 headers
+
+#include "wx/mmedia/vidbase.h"
+
+// ----------------------------------------------------------------------------
+// System headers and private types
+
+#ifdef WXMMEDIA_INTERNAL
+#include <windows.h>
+#include <mmsystem.h>
+
+typedef struct VIDW_Internal {
+ MCIDEVICEID m_dev_id;
+} wxVIDWinternal;
+#endif
+
+// ----------------------------------------------------------------------------
+// Class definition
+
+class WXDLLEXPORT wxVideoWindows : public wxVideoBaseDriver {
+ DECLARE_DYNAMIC_CLASS(wxVideoWindows)
+protected:
+ struct VIDW_Internal *m_internal;
+ bool m_paused, m_stopped, m_remove_file;
+ wxString m_filename;
+ double m_frameRate;
+ wxUint8 m_bps;
+
+ void OpenFile();
+public:
+ wxVideoWindows(void);
+ wxVideoWindows(wxInputStream& str);
+ wxVideoWindows(const wxString& fname);
+ ~wxVideoWindows(void);
+
+ bool Play();
+ bool Stop();
+ bool Pause();
+ bool Resume();
+
+ bool GetSize(wxSize& size) const;
+ bool SetSize(wxSize size);
+
+ // Return codec name for each stream.
+ wxString GetMovieCodec() const;
+ wxString GetAudioCodec() const;
+ // Return misc. info about audio
+ wxUint32 GetSampleRate() const;
+ wxUint8 GetChannels() const;
+ wxUint8 GetBPS() const;
+ // Return the frame rate of the video (in frames/second)
+ double GetFrameRate() const;
+ // Return the total number of frames in the movie
+ wxUint32 GetNbFrames() const;
+
+ bool IsCapable(wxVideoType v_type);
+
+ bool AttachOutput(wxWindow& output);
+ void DetachOutput(void);
+
+ bool IsPaused() const;
+ bool IsStopped() const;
+};
+
+#endif
--- /dev/null
+// /////////////////////////////////////////////////////////////////////////////
+// Name: vidxanm.h
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: 1997
+// Updated: 1998
+// Copyright: (C) 1997, 1998, Guilhem Lavaux
+// License: wxWindows license
+// /////////////////////////////////////////////////////////////////////////////
+/* Real -*- C++ -*- */
+#ifndef __VID_xanim_H__
+#define __VID_xanim_H__
+
+#ifdef __GNUG__
+ #pragma interface "vidxanm.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// for all others, include the necessary headers (this file is usually all you
+// need because it includes almost all "standard" wxWindows headers
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+ #include "wx/string.h"
+ #include "wx/process.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// System dependent headers
+
+#if defined(WXMMEDIA_INTERNAL) && (defined(__X__) || defined(__WXGTK__))
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#endif
+
+// ----------------------------------------------------------------------------
+// wxMMedia2 headers
+
+#include "wx/mmedia/vidbase.h"
+
+// ----------------------------------------------------------------------------
+// Internal types
+
+#ifdef WXMMEDIA_INTERNAL
+typedef struct wxXANIMinternal {
+ Display *xanim_dpy;
+ Window xanim_window;
+ Atom xanim_atom, xanim_ret;
+} wxXANIMinternal;
+
+#ifndef __XANIM_COMMAND__
+ #define __XANIM_COMMAND__ "/usr/X11R6/bin/xanim"
+#endif
+
+#endif
+
+// ----------------------------------------------------------------------------
+// Class definition
+
+class WXDLLEXPORT wxVideoXANIM : public wxVideoBaseDriver {
+ DECLARE_DYNAMIC_CLASS(wxVideoXANIM)
+ protected:
+ // Remember the state of the subprocess
+ bool m_xanim_started, m_paused;
+ // Pure X11 variables
+ struct wxXANIMinternal *m_internal;
+ wxString m_filename;
+ wxProcess *m_xanim_detector;
+ // Remember to delete the temporary file when necessary
+ bool m_remove_file;
+ wxUint32 m_size[2];
+ wxUint32 m_sampleRate;
+ wxUint8 m_channels;
+ wxUint8 m_bps;
+ wxUint32 m_frames;
+ double m_frameRate;
+ wxString m_movieCodec, m_audioCodec;
+
+ public:
+ wxVideoXANIM();
+ wxVideoXANIM(wxInputStream& str);
+ wxVideoXANIM(const wxString& filename);
+ ~wxVideoXANIM();
+
+ bool Play();
+ bool Pause();
+ bool Resume();
+ bool Stop();
+
+ bool SetVolume(wxUint8 vol);
+ bool SetSize(wxSize size);
+ bool GetSize(wxSize& size) const;
+
+ // Return the video codec name
+ wxString GetMovieCodec() const;
+ // Return the audio codec name
+ wxString GetAudioCodec() const;
+ // Return misc info about audio
+ wxUint32 GetSampleRate() const;
+ wxUint8 GetChannels() const;
+ wxUint8 GetBPS() const;
+ // Return frame rate
+ double GetFrameRate() const;
+ // Return number of frames in the movie
+ wxUint32 GetNbFrames() const;
+
+ bool IsCapable(wxVideoType v_type) const;
+
+ bool AttachOutput(wxWindow& output);
+ void DetachOutput();
+
+ bool IsPaused() const;
+ bool IsStopped() const;
+
+ friend class wxVideoXANIMProcess;
+
+protected:
+ // Start the subprocess with the right parameters
+ bool RestartXANIM();
+ // Send a command to the subprocess
+ bool SendCommand(const char *command,char **ret = NULL,
+ wxUint32 *size = NULL);
+
+ // Collect informations from XAnim
+ bool CollectInfo();
+};
+
+#endif
--- /dev/null
+#
+# Makefile : Builds wxWindows utils for Unix.
+#
+
+all:
+ cd mmedia; make
+
+clean:
+ cd mmedia; make clean
+
--- /dev/null
+#
+# File: makefile.unx
+# Author: Julian Smart
+# Created: 1998
+# Updated:
+# Copyright: (c) 1998 Julian Smart
+#
+# "%W% %G%"
+#
+# Makefile for minimal example (UNIX).
+
+top_srcdir = @top_srcdir@/..
+top_builddir = ../../..
+program_dir = contrib/samples/mmedia
+
+PROGRAM=mmboard
+
+OBJECTS=mmboard.o mmbman.o
+
+EXTRA_LIBS= $(top_builddir)/lib/libwxmmedia2.a @ESD_LIBS@
+# the comment at the end of the next line is needed because otherwise autoconf
+# would remove this line completely - it contains a built-in hack to remove
+# any VPATH assignment not containing ':'
+VPATH = @PATH_IFS@$(top_srcdir)/contrib/samples/mmedia # ':' for autoconf
+
+include ../../../src/make.env
+
+.SUFFIXES: .o .cpp .c
+
+.cpp.o:
+ $(CC) -c $(CPPFLAGS) $(EXTRA_CPPFLAGS) -o $@ $<
+
+all: $(PROGRAM)
+
+mmboard: $(OBJECTS)
+ $(CC) $(LDFLAGS) -o mmboard $(OBJECTS) $(EXTRA_LIBS) $(LDLIBS) $(top_builddir)/lib/@WX_TARGET_LIBRARY@
--- /dev/null
+#*****************************************************************************
+# *
+# Make file for VMS *
+# Author : J.Jansen (joukj@hrem.stm.tudelft.nl) *
+# Date : 10 November 1999 *
+# *
+#*****************************************************************************
+.first
+ define wx [--.include.wx]
+
+.ifdef __WXMOTIF__
+CXX_DEFINE = /define=(__WXMOTIF__=1)
+.else
+CXX_DEFINE =
+.endif
+
+.suffixes : .cpp
+
+.cpp.obj :
+ cxx $(CXXFLAGS)$(CXX_DEFINE) $(MMS$TARGET_NAME).cpp
+
+all :
+ $(MMS)$(MMSQUALIFIERS) minimal.exe
+
+minimal.exe : minimal.obj
+.ifdef __WXMOTIF__
+ cxxlink minimal,[--.lib]vms/opt
+.endif
+
+minimal.obj : minimal.cpp
--- /dev/null
+/* XPM */
+static char * eject_xpm[] = {
+"15 16 5 1",
+" c None",
+". c #949594",
+"+ c #000000",
+"@ c #FFFFFF",
+"# c #8E8E8E",
+" . ",
+" .+@ ",
+" .+++@ ",
+" .+++++@ ",
+" .+++++++@ ",
+" .+++++++++@ ",
+" .+++++++++++@ ",
+".+############@",
+".@@@@@@@@@@@@@@",
+" ",
+"...............",
+".++++++++++++#@",
+".++++++++++++#@",
+".++++++++++++#@",
+".+############@",
+".@@@@@@@@@@@@@@"};
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: mmbman.cpp
+// Purpose: Multimedia Board manager
+// Author: Guilhem Lavaux, <guilhem.lavaux@libertysurf.fr>
+// Modified by:
+// Created: 13/02/2000
+// RCS-ID: $Id$
+// Copyright: (c) 2000, Guilhem Lavaux
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+ #pragma implementation "mmbman.cpp"
+#endif
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// for all others, include the necessary headers (this file is usually all you
+// need because it includes almost all "standard" wxWindows headers
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
+#endif
+
+// Personal headers
+
+#include "wx/stream.h"
+#include "wx/wfstream.h"
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndfile.h"
+#include "wx/mmedia/sndwav.h"
+#include "wx/mmedia/sndaiff.h"
+#include "wx/mmedia/sndpcm.h"
+#include "wx/mmedia/sndulaw.h"
+
+#ifdef __UNIX__
+#include "wx/mmedia/sndoss.h"
+#include "wx/mmedia/sndesd.h"
+#endif
+
+#ifdef __WIN32__
+#include "wx/mmedia/sndwin.h"
+#endif
+
+#include "wx/mmedia/vidbase.h"
+#ifdef __UNIX__
+#include "wx/mmedia/vidxanm.h"
+#endif
+
+#ifdef __WIN32__
+#include "wx/mmedia/vidwin.h"
+#endif
+
+#include "mmboard.h"
+#include "mmbman.h"
+
+// ----------------------------------------------------------------------------
+// Private class definitions
+// ----------------------------------------------------------------------------
+
+class MMBoardSoundFile: public MMBoardFile {
+public:
+ MMBoardSoundFile(const wxString& filename);
+ ~MMBoardSoundFile();
+
+ bool NeedWindow();
+
+ void SetWindow(wxWindow *window);
+
+ void Play();
+ void Pause();
+ void Resume();
+ void Stop();
+
+ MMBoardTime GetPosition();
+ MMBoardTime GetLength();
+ void SetPosition(MMBoardTime btime);
+
+ bool IsStopped();
+ bool IsPaused();
+
+ wxString GetStringType();
+ wxString GetStringInformation();
+
+protected:
+ wxSoundFileStream *GetDecoder();
+
+ wxSoundStream *m_output_stream;
+ wxInputStream *m_input_stream;
+ wxSoundFileStream *m_file_stream;
+
+ MMBoardTime m_length;
+ wxUint8 m_file_type;
+};
+
+class MMBoardVideoFile: public MMBoardFile {
+public:
+ MMBoardVideoFile(const wxString& filename);
+ ~MMBoardVideoFile();
+
+ bool NeedWindow();
+
+ void SetWindow(wxWindow *window);
+
+ void Play();
+ void Pause();
+ void Resume();
+ void Stop();
+
+ MMBoardTime GetPosition();
+ MMBoardTime GetLength();
+ void SetPosition(MMBoardTime btime);
+
+ bool IsStopped();
+ bool IsPaused();
+
+ wxString GetStringType();
+ wxString GetStringInformation();
+
+protected:
+ wxWindow *m_output_window;
+ wxVideoBaseDriver *m_video_driver;
+};
+
+// ----------------------------------------------------------------------------
+// Implementation
+// ----------------------------------------------------------------------------
+
+#define MMBoard_UNKNOWNTYPE 0
+#define MMBoard_WAVE 1
+#define MMBoard_AIFF 2
+
+// ----------------------------------------------------------------------------
+// MMBoardSoundFile
+
+MMBoardSoundFile::MMBoardSoundFile(const wxString& filename)
+ : MMBoardFile()
+{
+ m_input_stream = new wxFileInputStream(filename);
+ m_output_stream = MMBoardManager::OpenSoundStream();
+
+ m_file_stream = GetDecoder();
+
+ if (!m_file_stream) {
+ SetError(MMBoard_UnknownFile);
+ return;
+ }
+
+ // Compute length
+ wxUint32 length, seconds;
+
+ length = m_file_stream->GetLength();
+ seconds = m_file_stream->GetSoundFormat().GetTimeFromBytes(length);
+ m_length.seconds = seconds % 60;
+ m_length.minutes = (seconds / 60) % 60;
+ m_length.hours = seconds / 3600;
+}
+
+MMBoardSoundFile::~MMBoardSoundFile()
+{
+ if (m_file_stream)
+ delete m_file_stream;
+ MMBoardManager::UnrefSoundStream(m_output_stream);
+ delete m_input_stream;
+}
+
+wxSoundFileStream *MMBoardSoundFile::GetDecoder()
+{
+ wxSoundFileStream *f_stream;
+
+ // First, we try a Wave decoder
+ f_stream = new wxSoundWave(*m_input_stream, *m_output_stream);
+ m_file_type = MMBoard_WAVE;
+ if (f_stream->CanRead())
+ return f_stream;
+ delete f_stream;
+
+ // Then, a AIFF decoder
+ f_stream = new wxSoundAiff(*m_input_stream, *m_output_stream);
+ m_file_type = MMBoard_AIFF;
+ if (f_stream->CanRead())
+ return f_stream;
+ delete f_stream;
+
+ m_file_type = MMBoard_UNKNOWNTYPE;
+
+ // TODO: automate
+
+ return NULL;
+}
+
+MMBoardTime MMBoardSoundFile::GetLength()
+{
+ return m_length;
+}
+
+bool MMBoardSoundFile::IsStopped()
+{
+ return m_file_stream->IsStopped();
+}
+
+bool MMBoardSoundFile::IsPaused()
+{
+ return m_file_stream->IsPaused();
+}
+
+MMBoardTime MMBoardSoundFile::GetPosition()
+{
+ wxUint32 length, seconds;
+ MMBoardTime file_time;
+
+ file_time.seconds = file_time.minutes = file_time.hours = 0;
+ if (m_file_stream->IsStopped())
+ return file_time;
+
+ length = m_file_stream->GetPosition();
+ seconds = m_file_stream->GetSoundFormat().GetTimeFromBytes(length);
+ file_time.seconds = seconds % 60;
+ file_time.minutes = (seconds / 60) % 60;
+ file_time.hours = seconds / 3600;
+
+ return file_time;
+}
+
+void MMBoardSoundFile::SetPosition(MMBoardTime btime)
+{
+ wxUint32 itime;
+
+ itime = btime.seconds + btime.minutes * 60 + btime.hours;
+
+ m_file_stream->SetPosition(
+ m_file_stream->GetSoundFormat().GetBytesFromTime(itime)
+ );
+}
+
+bool MMBoardSoundFile::NeedWindow()
+{
+ return FALSE;
+}
+
+void MMBoardSoundFile::SetWindow(wxWindow *window)
+{
+}
+
+void MMBoardSoundFile::Play()
+{
+ m_file_stream->Play();
+}
+
+void MMBoardSoundFile::Pause()
+{
+ m_file_stream->Pause();
+}
+
+void MMBoardSoundFile::Resume()
+{
+ m_file_stream->Resume();
+}
+
+void MMBoardSoundFile::Stop()
+{
+ m_file_stream->Stop();
+}
+
+wxString MMBoardSoundFile::GetStringType()
+{
+ switch (m_file_type) {
+ case MMBoard_WAVE:
+ return wxString(wxT("WAVE file"));
+ break;
+ case MMBoard_AIFF:
+ return wxString(wxT("AIFF file"));
+ break;
+ default:
+ return wxString(wxT("Unknown file"));
+ break;
+ }
+}
+
+wxString MMBoardSoundFile::GetStringInformation()
+{
+ wxString info;
+ wxSoundFormatBase *format;
+
+ format = &(m_file_stream->GetSoundFormat());
+
+ info = wxT("Data encoding: ");
+ switch (format->GetType()) {
+ case wxSOUND_PCM: {
+ wxSoundFormatPcm *pcm_format = (wxSoundFormatPcm *)format;
+
+ info += wxString::Format(wxT("PCM %s %s\n"),
+ pcm_format->Signed() ? wxT("signed") : wxT("unsigned"),
+ pcm_format->GetOrder() == wxLITTLE_ENDIAN ? wxT("little endian") : wxT("big endian"));
+ info += wxString::Format(wxT("Sampling rate: %d\n")
+ wxT("Bits per sample: %d\n")
+ wxT("Number of channels: %d\n"),
+ pcm_format->GetSampleRate(),
+ pcm_format->GetBPS(),
+ pcm_format->GetChannels());
+
+ break;
+ }
+ case wxSOUND_ULAW: {
+ wxSoundFormatUlaw *ulaw_format = (wxSoundFormatUlaw *)format;
+ info += wxT("ULAW\n");
+ info += wxString::Format(wxT("Sampling rate: %d\n"), ulaw_format->GetSampleRate());
+ break;
+ }
+ default:
+ info += wxT("Unknown");
+ break;
+ }
+ return info;
+}
+
+// ----------------------------------------------------------------------------
+
+
+// ----------------------------------------------------------------------------
+// MMBoardVideoFile
+
+MMBoardVideoFile::MMBoardVideoFile(const wxString& filename)
+{
+ m_output_window = NULL;
+
+#if defined(__UNIX__)
+ m_video_driver = new wxVideoXANIM(filename);
+#elif defined(__WIN32__)
+ m_video_driver = new wxVideoWindows(filename);
+#else
+ m_video_driver = NULL;
+ SetError(MMBoard_UnknownFile);
+#endif
+}
+
+MMBoardVideoFile::~MMBoardVideoFile()
+{
+ if (m_video_driver)
+ delete m_video_driver;
+}
+
+bool MMBoardVideoFile::NeedWindow()
+{
+ return TRUE;
+}
+
+void MMBoardVideoFile::SetWindow(wxWindow *window)
+{
+ m_output_window = window;
+ m_video_driver->AttachOutput(*window);
+
+ wxSize size;
+ m_video_driver->GetSize(size);
+ window->SetSize(size);
+ // BAD BAD
+ // and we remove
+ // window->GetParent()->GetSizer()->Fit(window->GetParent());
+}
+
+void MMBoardVideoFile::Play()
+{
+ m_video_driver->Play();
+}
+
+void MMBoardVideoFile::Pause()
+{
+ m_video_driver->Pause();
+}
+
+void MMBoardVideoFile::Resume()
+{
+ m_video_driver->Resume();
+}
+
+void MMBoardVideoFile::Stop()
+{
+ m_video_driver->Stop();
+}
+
+MMBoardTime MMBoardVideoFile::GetPosition()
+{
+ MMBoardTime btime;
+
+ btime.seconds = btime.minutes = btime.hours = 0;
+ return btime;
+}
+
+MMBoardTime MMBoardVideoFile::GetLength()
+{
+ MMBoardTime btime;
+ int frameTime;
+
+ frameTime = (int)( m_video_driver->GetNbFrames() / m_video_driver->GetFrameRate());
+
+ btime.seconds = frameTime % 60;
+ btime.minutes = (frameTime / 60) % 60;
+ btime.hours = frameTime / 3600;
+ return btime;
+}
+
+void MMBoardVideoFile::SetPosition(MMBoardTime btime)
+{
+}
+
+bool MMBoardVideoFile::IsStopped()
+{
+ return m_video_driver->IsStopped();
+}
+
+bool MMBoardVideoFile::IsPaused()
+{
+ return m_video_driver->IsPaused();
+}
+
+wxString MMBoardVideoFile::GetStringType()
+{
+ return wxString(wxT("Video XANIM"));
+}
+
+wxString MMBoardVideoFile::GetStringInformation()
+{
+ wxString info;
+
+ info = wxT("Video codec: ");
+ info += m_video_driver->GetMovieCodec() + "\n";
+ info += wxT("Audio codec: ");
+ info += m_video_driver->GetAudioCodec();
+ info += wxString::Format(" Sample rate: %d Channels: %d\n", m_video_driver->GetSampleRate(),
+ m_video_driver->GetBPS());
+ info += wxString::Format(" Frame rate: %.01f", m_video_driver->GetFrameRate());
+ return info;
+}
+
+// ----------------------------------------------------------------------------
+
+// ----------------------------------------------------------------------------
+// MMBoardFile
+
+MMBoardFile::MMBoardFile()
+{
+ m_error = 0;
+}
+
+MMBoardFile::~MMBoardFile()
+{
+}
+
+//
+// ----------------------------------------------------------------------------
+
+// ----------------------------------------------------------------------------
+// MMBoardManager
+
+MMBoardFile *MMBoardManager::Open(const wxString& filename)
+{
+ MMBoardFile *file;
+
+ // Test the audio codec
+ file = new MMBoardSoundFile(filename);
+ if (!file->GetError())
+ return file;
+ delete file;
+
+ // Test the video codec
+ file = new MMBoardVideoFile(filename);
+ if (!file->GetError())
+ return file;
+ delete file;
+
+ // Arrrgh, we just could not see what is that file ...
+ return NULL;
+}
+
+DECLARE_APP(MMBoardApp)
+
+wxSoundStream *MMBoardManager::OpenSoundStream()
+{
+#ifdef __UNIX__
+ if ((wxGetApp().m_caps & MM_SOUND_ESD) != 0)
+ return new wxSoundStreamESD();
+
+ if ((wxGetApp().m_caps & MM_SOUND_OSS) != 0)
+ return new wxSoundStreamOSS();
+#endif
+
+#ifdef __WIN32__
+ if ((wxGetApp().m_caps & MM_SOUND_WIN) != 0)
+ return new wxSoundStreamWin();
+#endif
+
+ wxMessageBox("You are trying to open a multimedia but you have not devices", "Error", wxOK | wxICON_ERROR, NULL);
+
+ return NULL;
+}
+
+void MMBoardManager::UnrefSoundStream(wxSoundStream *stream)
+{
+ delete stream;
+}
+
+// ----------------------------------------------------------------------------
+
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: mmbman.h
+// Purpose: Multimedia Board manager
+// Author: Guilhem Lavaux, <guilhem.lavaux@libertysurf.fr>
+// Modified by:
+// Created: 13/02/2000
+// RCS-ID: $Id$
+// Copyright: (c) 2000, Guilhem Lavaux
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _MMBMAN_APP_H_
+#define _MMBMAN_APP_H_
+
+#ifdef __GNUG__
+ #pragma interface "mmbman.cpp"
+#endif
+
+#include "wx/stream.h"
+#include "wx/mmedia/sndbase.h"
+
+// -------------------------------------------------------------------------
+// Base structure definitions
+// -------------------------------------------------------------------------
+
+typedef struct {
+ wxUint8 seconds, minutes, hours;
+} MMBoardTime;
+
+// -------------------------------------------------------------------------
+// Constants
+// -------------------------------------------------------------------------
+
+#define MMBoard_NoError 0
+#define MMBoard_UnknownFile 1
+
+// -------------------------------------------------------------------------
+// Interface definition: MMBoardFile
+// -------------------------------------------------------------------------
+
+class MMBoardFile {
+ public:
+ MMBoardFile();
+ virtual ~MMBoardFile();
+
+ virtual bool NeedWindow() = 0;
+
+ virtual void SetWindow(wxWindow *window) = 0;
+
+ virtual void Play() = 0;
+ virtual void Pause() = 0;
+ virtual void Resume() = 0;
+ virtual void Stop() = 0;
+
+ virtual MMBoardTime GetPosition() = 0;
+ virtual MMBoardTime GetLength() = 0;
+ virtual void SetPosition(MMBoardTime btime) = 0;
+
+ virtual bool IsStopped() = 0;
+ virtual bool IsPaused() = 0;
+
+ virtual wxString GetStringType() = 0;
+ virtual wxString GetStringInformation() = 0;
+
+ void SetError(wxUint8 error) { m_error = error; }
+ wxUint8 GetError() const { return m_error; }
+
+ protected:
+ wxUint8 m_error;
+};
+
+// -------------------------------------------------------------------------
+// Main manager
+// -------------------------------------------------------------------------
+
+class MMBoardManager {
+ public:
+ static MMBoardFile *Open(const wxString& filename);
+
+ static wxSoundStream *OpenSoundStream();
+ static void UnrefSoundStream(wxSoundStream *stream);
+};
+
+#endif
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: mmboard.cpp
+// Purpose: Multimedia Library sample
+// Author: Guilhem Lavaux (created from minimal by J. Smart)
+// Modified by:
+// Created: 13/02/2000
+// RCS-ID: $Id$
+// Copyright: (c) Guilhem Lavaux
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+#ifdef __GNUG__
+ #pragma implementation "mmboard.cpp"
+#endif
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// for all others, include the necessary headers (this file is usually all you
+// need because it includes almost all "standard" wxWindows headers
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
+#endif
+
+// ----------------------------------------------------------------------------
+// ressources
+// ----------------------------------------------------------------------------
+// the application icon
+#if defined(__WXGTK__) || defined(__WXMOTIF__)
+ #include "mondrian.xpm"
+#endif
+
+// include multimedia classes
+#include "wx/mmedia/sndbase.h"
+#ifdef __WIN32__
+ #include "wx/mmedia/sndwin.h"
+#endif
+#ifdef __UNIX__
+ #include "wx/mmedia/sndoss.h"
+ #include "wx/mmedia/sndesd.h"
+#endif
+
+#include "wx/statline.h"
+#include "wx/stattext.h"
+
+// include personnal classes
+#include "mmboard.h"
+#include "mmbman.h"
+
+#include "play.xpm"
+#include "stop.xpm"
+#include "eject.xpm"
+#include "pause.xpm"
+
+// ----------------------------------------------------------------------------
+// private classes
+// ----------------------------------------------------------------------------
+
+// Main Multimedia Board frame
+class MMBoardFrame : public wxFrame
+{
+public:
+ // ctor(s)
+ MMBoardFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
+ // dtor
+ ~MMBoardFrame();
+
+ // event handlers
+ void OnQuit(wxCommandEvent& event);
+ void OnAbout(wxCommandEvent& event);
+ void OnOpen(wxCommandEvent& event);
+ void OnPlay(wxCommandEvent& event);
+ void OnStop(wxCommandEvent& event);
+ void OnPause(wxCommandEvent& event);
+ void OnEject(wxCommandEvent& event);
+ void OnRefreshInfo(wxEvent& event);
+ void OnSetPosition(wxCommandEvent& event);
+
+ void OpenVideoWindow();
+ void CloseVideoWindow();
+
+private:
+ // any class wishing to process wxWindows events must use this macro
+ DECLARE_EVENT_TABLE()
+
+private:
+ void UpdateMMedInfo();
+ void UpdateInfoText();
+
+ MMBoardFile *m_opened_file;
+
+ wxSlider *m_positionSlider;
+ wxBitmapButton *m_playButton, *m_pauseButton, *m_stopButton, *m_ejectButton;
+ wxStaticText *m_fileType, *m_infoText;
+ wxWindow *m_video_window;
+
+ wxPanel *m_panel;
+ wxSizer *m_sizer;
+
+ wxTimer *m_refreshTimer;
+};
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+// IDs for the controls and the menu commands
+enum
+{
+ // menu items
+ MMBoard_Quit = 1,
+ MMBoard_Open,
+ MMBoard_About,
+ MMBoard_PositionSlider,
+ MMBoard_PlayButton,
+ MMBoard_PauseButton,
+ MMBoard_ResumeButton,
+ MMBoard_StopButton,
+ MMBoard_EjectButton,
+ MMBoard_RefreshInfo
+};
+
+// ----------------------------------------------------------------------------
+// event tables and other macros for wxWindows
+// ----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(MMBoardFrame, wxFrame)
+ EVT_MENU(MMBoard_Quit, MMBoardFrame::OnQuit)
+ EVT_MENU(MMBoard_About, MMBoardFrame::OnAbout)
+ EVT_MENU(MMBoard_Open, MMBoardFrame::OnOpen)
+ EVT_BUTTON(MMBoard_PlayButton, MMBoardFrame::OnPlay)
+ EVT_BUTTON(MMBoard_StopButton, MMBoardFrame::OnStop)
+ EVT_BUTTON(MMBoard_PauseButton, MMBoardFrame::OnPause)
+ EVT_BUTTON(MMBoard_EjectButton, MMBoardFrame::OnEject)
+ EVT_SLIDER(MMBoard_PositionSlider, MMBoardFrame::OnSetPosition)
+ EVT_CUSTOM(wxEVT_TIMER, MMBoard_RefreshInfo, MMBoardFrame::OnRefreshInfo)
+END_EVENT_TABLE()
+
+// ---------------------------------------------------------------------------
+// Main board application launcher
+// ---------------------------------------------------------------------------
+
+IMPLEMENT_APP(MMBoardApp)
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// the application class
+// ----------------------------------------------------------------------------
+
+bool MMBoardApp::OnInit()
+{
+ // create the main application window
+ MMBoardFrame *frame = new MMBoardFrame("Multimedia Board",
+ wxPoint(50, 50), wxSize(450, 340));
+
+ // and show it (the frames, unlike simple controls, are not shown when
+ // created initially)
+ frame->Show(TRUE);
+
+ m_caps = TestMultimediaCaps();
+
+ if (!m_caps) {
+ wxMessageBox("Your system has no multimedia capabilities. We are exiting now.", "Major error !", wxOK | wxICON_ERROR, NULL);
+ return FALSE;
+ }
+
+ wxString msg;
+ msg.Printf("Detected : %s%s%s", (m_caps & MM_SOUND_OSS) ? "OSS " : "",
+ (m_caps & MM_SOUND_ESD) ? "ESD " : "",
+ (m_caps & MM_SOUND_WIN) ? "WIN" : "");
+
+ wxMessageBox(msg, "Good !", wxOK | wxICON_INFORMATION, NULL);
+
+ // success: wxApp::OnRun() will be called which will enter the main message
+ // loop and the application will run. If we returned FALSE here, the
+ // application would exit immediately.
+ return TRUE;
+}
+
+wxUint8 MMBoardApp::TestMultimediaCaps()
+{
+ wxSoundStream *dev;
+ wxUint8 caps;
+
+ caps = 0;
+
+#ifdef __UNIX__
+ // We now test the ESD support
+
+ dev = new wxSoundStreamESD();
+ if (dev->GetError() == wxSOUND_NOERROR)
+ caps |= MM_SOUND_ESD;
+ delete dev;
+
+ // We test the OSS (Open Sound System) support.
+ // WARNING: There is a conflict between ESD and ALSA
+
+ dev = new wxSoundStreamOSS();
+ if (dev->GetError() == wxSOUND_NOERROR)
+ caps |= MM_SOUND_OSS;
+ delete dev;
+#endif
+
+#ifdef __WIN32__
+ // We test the Windows sound support.
+
+ dev = new wxSoundStreamWin();
+ if (dev->GetError() == wxSOUND_NOERR)
+ caps |= MM_SOUND_WIN;
+ delete dev;
+#endif
+
+ return caps;
+}
+
+// ----------------------------------------------------------------------------
+// main frame
+// ----------------------------------------------------------------------------
+
+// frame constructor
+MMBoardFrame::MMBoardFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
+ : wxFrame((wxFrame *)NULL, -1, title, pos, size)
+{
+#ifdef __WXMAC__
+ // we need this in order to allow the about menu relocation, since ABOUT is
+ // not the default id of the about menu
+ wxApp::s_macAboutMenuItemId = MMBoard_About;
+#endif
+
+ // set the frame icon
+ SetIcon(wxICON(mondrian));
+
+ // create a menu bar
+ wxMenu *menuFile = new wxMenu(wxT(""), wxMENU_TEAROFF);
+
+ // the "About" item should be in the help menu
+ wxMenu *helpMenu = new wxMenu;
+ helpMenu->Append(MMBoard_About, wxT("&About...\tCtrl-A"), wxT("Show about dialog"));
+
+ menuFile->Append(MMBoard_Open, wxT("&Open\tAlt-O"), wxT("Open file"));
+ menuFile->AppendSeparator();
+ menuFile->Append(MMBoard_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program"));
+
+ // now append the freshly created menu to the menu bar...
+ wxMenuBar *menuBar = new wxMenuBar();
+ menuBar->Append(menuFile, wxT("&File"));
+ menuBar->Append(helpMenu, wxT("&Help"));
+
+ // ... and attach this menu bar to the frame
+ SetMenuBar(menuBar);
+
+#if wxUSE_STATUSBAR
+ // create a status bar just for fun (by default with 1 pane only)
+ CreateStatusBar(3);
+ SetStatusText(wxT("Welcome to wxWindows!"));
+#endif // wxUSE_STATUSBAR
+
+ // Misc variables
+ m_opened_file = NULL;
+
+ m_panel = new wxPanel(this, -1);
+
+ // Initialize main slider
+ m_positionSlider = new wxSlider( m_panel, MMBoard_PositionSlider, 0, 0, 60,
+ wxDefaultPosition, wxSize(300, -1),
+ wxSL_HORIZONTAL | wxSL_AUTOTICKS);
+ m_positionSlider->SetPageSize(60); // 60 secs
+ m_positionSlider->Enable(FALSE);
+
+ // Initialize info panel
+ wxPanel *infoPanel = new wxPanel( m_panel, -1);
+ infoPanel->SetBackgroundColour(*wxBLACK);
+ infoPanel->SetForegroundColour(*wxWHITE);
+
+ wxBoxSizer *infoSizer = new wxBoxSizer(wxVERTICAL);
+
+ m_fileType = new wxStaticText(infoPanel, -1, wxT(""));
+ wxStaticLine *line = new wxStaticLine(infoPanel, -1);
+ m_infoText = new wxStaticText(infoPanel, -1, "");
+
+ UpdateInfoText();
+
+ infoSizer->Add(m_fileType, 0, wxGROW | wxALL, 1);
+ infoSizer->Add(line, 0, wxGROW | wxCENTRE, 20);
+ infoSizer->Add(m_infoText, 0, wxGROW | wxALL, 1);
+
+ infoPanel->SetSizer(infoSizer);
+ infoPanel->SetAutoLayout(TRUE);
+
+ // Bitmap button panel
+ wxBoxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL);
+
+ wxBitmap *play_bmp = new wxBitmap(play_back_xpm);
+ wxBitmap *stop_bmp = new wxBitmap(stop_back_xpm);
+ wxBitmap *eject_bmp = new wxBitmap(eject_xpm);
+ wxBitmap *pause_bmp = new wxBitmap(pause_xpm);
+
+ m_playButton = new wxBitmapButton(m_panel, MMBoard_PlayButton, *play_bmp);
+ m_playButton->Enable(FALSE);
+ m_pauseButton = new wxBitmapButton(m_panel, MMBoard_PauseButton, *pause_bmp);
+ m_pauseButton->Enable(FALSE);
+ m_stopButton = new wxBitmapButton(m_panel, MMBoard_StopButton, *stop_bmp);
+ m_stopButton->Enable(FALSE);
+ m_ejectButton = new wxBitmapButton(m_panel, MMBoard_EjectButton, *eject_bmp);
+ m_ejectButton->Enable(FALSE);
+
+ buttonSizer->Add(m_playButton, 0, wxALL, 2);
+ buttonSizer->Add(m_pauseButton, 0, wxALL, 2);
+ buttonSizer->Add(m_stopButton, 0, wxALL, 2);
+ buttonSizer->Add(m_ejectButton, 0, wxALL, 2);
+
+ // Top sizer
+ m_sizer = new wxBoxSizer(wxVERTICAL);
+ m_sizer->Add(new wxStaticLine(m_panel, -1), 0, wxGROW | wxCENTRE, 0);
+ m_sizer->Add(m_positionSlider, 0, wxCENTRE | wxGROW | wxALL, 2);
+ m_sizer->Add(new wxStaticLine(m_panel, -1), 0, wxGROW | wxCENTRE, 0);
+ m_sizer->Add(buttonSizer, 0, wxALL, 0);
+ m_sizer->Add(new wxStaticLine(m_panel, -1), 0, wxGROW | wxCENTRE, 0);
+ m_sizer->Add(infoPanel, 1, wxCENTRE | wxGROW, 0);
+
+ m_panel->SetSizer(m_sizer);
+ m_panel->SetAutoLayout(TRUE);
+ m_sizer->Fit(this);
+ m_sizer->SetSizeHints(this);
+
+ // Timer
+ m_refreshTimer = new wxTimer(this, MMBoard_RefreshInfo);
+
+ // Video window
+ m_video_window = NULL;
+
+ // Multimedia file
+ m_opened_file = NULL;
+}
+
+MMBoardFrame::~MMBoardFrame()
+{
+ if (m_opened_file)
+ delete m_opened_file;
+
+ delete m_refreshTimer;
+}
+
+void MMBoardFrame::OpenVideoWindow()
+{
+ if (m_video_window)
+ return;
+
+ m_video_window = new wxWindow(m_panel, -1, wxDefaultPosition, wxSize(200, 200));
+ m_video_window->SetBackgroundColour(*wxBLACK);
+ m_sizer->Prepend(m_video_window, 2, wxGROW | wxSHRINK | wxCENTRE, 1);
+
+ m_sizer->Fit(this);
+}
+
+void MMBoardFrame::CloseVideoWindow()
+{
+ if (!m_video_window)
+ return;
+
+ m_sizer->Remove(m_video_window);
+ delete m_video_window;
+ m_video_window = NULL;
+
+ m_sizer->Fit(this);
+}
+
+// event handlers
+
+void MMBoardFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
+{
+ // TRUE is to force the frame to close
+ Close(TRUE);
+}
+
+void MMBoardFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
+{
+ wxString msg;
+ msg.Printf( wxT("wxWindows Multimedia board v1.0a, wxMMedia v2.0a:\n")
+ wxT("an example of the capabilities of the wxWindows multimedia classes.\n")
+ wxT("Copyright 1999, 2000, Guilhem Lavaux.\n"));
+
+ wxMessageBox(msg, "About MMBoard", wxOK | wxICON_INFORMATION, this);
+}
+
+void MMBoardFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
+{
+ wxString selected_file;
+
+ if (m_opened_file) {
+ if (!m_opened_file->IsStopped()) {
+ wxCommandEvent event2;
+ OnStop(event2);
+ }
+ delete m_opened_file;
+ }
+
+ // select a file to be opened
+ selected_file = wxLoadFileSelector("multimedia", "*", NULL, this);
+ if (selected_file.IsNull())
+ return;
+
+ m_opened_file = MMBoardManager::Open(selected_file);
+
+ // Change the range values of the slider.
+ MMBoardTime length;
+
+ length = m_opened_file->GetLength();
+ m_positionSlider->SetRange(0, length.hours * 3600 + length.minutes * 60 + length.seconds);
+
+ // Update misc info
+ UpdateMMedInfo();
+
+ SetStatusText(selected_file, 2);
+
+ // Update info text
+ UpdateInfoText();
+
+ // Enable a few buttons
+ m_playButton->Enable(TRUE);
+ m_ejectButton->Enable(TRUE);
+ m_positionSlider->Enable(TRUE);
+
+ if (m_opened_file->NeedWindow()) {
+ OpenVideoWindow();
+ m_opened_file->SetWindow(m_video_window);
+ } else
+ CloseVideoWindow();
+}
+
+void MMBoardFrame::UpdateInfoText()
+{
+ wxString infotext1, infotext2;
+
+ if (m_opened_file) {
+ infotext1 = wxT("File type:\n\t");
+ infotext1 += m_opened_file->GetStringType() + wxT("\n");
+
+ infotext2 = wxT("File informations:\n\n");
+ infotext2 += m_opened_file->GetStringInformation();
+ } else {
+ infotext1 = wxT("File type: \n\tNo file opened");
+ infotext2 = wxT("File informations:\nNo information\n\n\n\n\n");
+ }
+
+ m_fileType->SetLabel(infotext1);
+ m_infoText->SetLabel(infotext2);
+}
+
+void MMBoardFrame::UpdateMMedInfo()
+{
+ wxString temp_string;
+ MMBoardTime current, length;
+
+ if (m_opened_file) {
+ current = m_opened_file->GetPosition();
+ length = m_opened_file->GetLength();
+ } else {
+ current.hours = current.minutes = current.seconds = 0;
+ length = current;
+ }
+
+ // We refresh the status bar
+ temp_string.Printf(wxT("%02d:%02d / %02d:%02d"), current.hours * 60 + current.minutes,
+ current.seconds, length.hours * 60 + length.minutes, length.seconds);
+ SetStatusText(temp_string, 1);
+
+ // We set the slider position
+ m_positionSlider->SetValue(current.hours * 3600 + current.minutes * 60 + current.seconds);
+}
+
+// ----------------------------------------------------------------------------
+// Playing management, refreshers, ...
+
+void MMBoardFrame::OnRefreshInfo(wxEvent& WXUNUSED(event))
+{
+ UpdateMMedInfo();
+
+ if (m_opened_file->IsStopped()) {
+ m_refreshTimer->Stop();
+ m_playButton->Enable(TRUE);
+ m_stopButton->Enable(FALSE);
+ m_pauseButton->Enable(FALSE);
+ }
+}
+
+void MMBoardFrame::OnPlay(wxCommandEvent& WXUNUSED(event))
+{
+ m_stopButton->Enable(TRUE);
+ m_pauseButton->Enable(TRUE);
+ m_playButton->Enable(FALSE);
+
+ if (m_opened_file->IsPaused()) {
+ m_opened_file->Resume();
+ return;
+ }
+
+ m_refreshTimer->Start(1000, FALSE);
+
+ m_opened_file->Play();
+
+ m_stopButton->Enable(TRUE);
+ m_pauseButton->Enable(TRUE);
+ m_playButton->Enable(FALSE);
+}
+
+void MMBoardFrame::OnStop(wxCommandEvent& WXUNUSED(event))
+{
+ m_opened_file->Stop();
+ m_refreshTimer->Stop();
+
+ m_stopButton->Enable(FALSE);
+ m_playButton->Enable(TRUE);
+
+ UpdateMMedInfo();
+}
+
+void MMBoardFrame::OnPause(wxCommandEvent& WXUNUSED(event))
+{
+ m_opened_file->Pause();
+
+ m_playButton->Enable(TRUE);
+ m_pauseButton->Enable(FALSE);
+}
+
+void MMBoardFrame::OnEject(wxCommandEvent& WXUNUSED(event))
+{
+ m_opened_file->Stop();
+
+ delete m_opened_file;
+ m_opened_file = NULL;
+
+ m_playButton->Enable(FALSE);
+ m_pauseButton->Enable(FALSE);
+ m_stopButton->Enable(FALSE);
+ m_ejectButton->Enable(FALSE);
+ m_positionSlider->Enable(FALSE);
+
+ UpdateInfoText();
+ UpdateMMedInfo();
+}
+
+void MMBoardFrame::OnSetPosition(wxCommandEvent& WXUNUSED(event))
+{
+ wxUint32 itime;
+ MMBoardTime btime;
+
+ itime = m_positionSlider->GetValue();
+ btime.seconds = itime % 60;
+ btime.minutes = (itime / 60) % 60;
+ btime.hours = itime / 3600;
+ m_opened_file->SetPosition(btime);
+
+ UpdateMMedInfo();
+}
+
--- /dev/null
+NAME Minimal
+DESCRIPTION 'Minimal wxWindows application'
+EXETYPE WINDOWS
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MOVEABLE MULTIPLE
+HEAPSIZE 4048
+STACKSIZE 16000
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: mmboard.h
+// Purpose: Multimedia Board header
+// Author: Guilhem Lavaux, <guilhem.lavaux@libertysurf.fr>
+// Modified by:
+// Created: 13/02/2000
+// RCS-ID: $Id$
+// Copyright: (c) 2000, Guilhem Lavaux
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _MMBOARD_APP_H_
+#define _MMBOARD_APP_H_
+
+#ifdef __GNUG__
+ #pragma interface "mmboard.cpp"
+#endif
+
+// for compilers that support precompilation, includes "wx/wx.h"
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// for all others, include the necessary headers
+#ifndef WX_PRECOMP
+ #include "wx/wx.h"
+#endif
+
+// --------------------------------------------------------------------------
+// constants
+// --------------------------------------------------------------------------
+
+#define MM_SOUND_OSS 0x01
+#define MM_SOUND_ESD 0x02
+#define MM_SOUND_WIN 0x04
+
+// --------------------------------------------------------------------------
+// Class definitions
+// --------------------------------------------------------------------------
+
+// Define a new application type, each program should derive a class from wxApp
+class MMBoardApp : public wxApp
+{
+public:
+ wxUint8 m_caps;
+
+ // override base class virtuals
+ // ----------------------------
+
+ virtual bool OnInit();
+
+ wxUint8 TestMultimediaCaps();
+};
+
+#endif
--- /dev/null
+mondrian ICON "mondrian.ico"
+#include "wx/msw/wx.rc"
+
+#define MINIMAL_QUIT 1
+#define MINIMAL_ABOUT 102
+
--- /dev/null
+ICON 1 PRELOAD "mondros2.ico"
+#include "H:\DEV\WX2\wxWindows\include\wx\os2\wx.rc"
+
+#define MINIMAL_QUIT 1
+#define MINIMAL_ABOUT 102
+
--- /dev/null
+/* XPM */
+static char *mondrian_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 6 1",
+" c Black",
+". c Blue",
+"X c #00bf00",
+"o c Red",
+"O c Yellow",
+"+ c Gray100",
+/* pixels */
+" ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" "
+};
--- /dev/null
+/* XPM */
+static char * pause_xpm[] = {
+"13 15 5 1",
+" c None",
+". c #949594",
+"+ c #000000",
+"@ c #8E8E8E",
+"# c #FFFFFF",
+"...... ......",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+++@# .+++@#",
+".+@@@# .+@@@#",
+".##### .#####"};
--- /dev/null
+/* XPM */
+static char * play_back_xpm[] = {
+"13 15 5 1",
+" c None",
+". c #949594",
+"+ c #000000",
+"@ c #8E8E8E",
+"# c #FFFFFF",
+"...... ",
+".+++++. ",
+".++++++. ",
+".+++++++. ",
+".++++++++. ",
+".+++++++++. ",
+".++++++++++. ",
+".++++++++++@#",
+".+++++++++@# ",
+".++++++++@# ",
+".+++++++@# ",
+".++++++@# ",
+".+++++@# ",
+".+@@@@# ",
+".##### "};
--- /dev/null
+/* XPM */
+static char * stop_back_xpm[] = {
+"13 15 5 1",
+" c None",
+". c #949594",
+"+ c #000000",
+"@ c #8E8E8E",
+"# c #FFFFFF",
+".............",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".++++++++++@#",
+".+@@@@@@@@@@#",
+".############"};
--- /dev/null
+#
+# Makefile : Builds wxWindows contrib src for Unix.
+#
+
+all:
+ cd ogl; make
+ cd mmedia; make
+
+clean:
+ cd ogl; make clean
+ cd mmedia; make clean
+
--- /dev/null
+// ---------------------------------------------------------------------------
+// Name: cdbase.cpp
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: 1997
+// Updated: 1999
+// Copyright: (C) 1997, 1998, 1999 Guilhem Lavaux
+// License: wxWindows license
+// ---------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation
+#endif
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+#endif
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+// ---------------------------------------------------------------------------
+// MMedia headers
+// ---------------------------------------------------------------------------
+
+#include "wx/mmedia/cdbase.h"
+
+// ---------------------------------------------------------------------------
+// Implementation
+// ---------------------------------------------------------------------------
+
+IMPLEMENT_ABSTRACT_CLASS(wxCDAudio, wxObject)
+
+wxCDtime wxCDAudio::CDtoc::GetTrackTime(wxUint8 track) const
+{
+ if (track > total_time.track) {
+ wxCDtime dummy_time = {0, 0, 0, 0};
+ return dummy_time;
+ }
+ return tracks_time[track];
+}
+
+wxCDtime wxCDAudio::CDtoc::GetTrackPos(wxUint8 track) const
+{
+ if (track > total_time.track) {
+ wxCDtime dummy_time = {0, 0, 0, 0};
+ return dummy_time;
+ }
+ return tracks_pos[track];
+}
+
+bool wxCDAudio::Play(const wxCDtime& beg_play)
+{
+ return Play(beg_play, GetToc().GetTotalTime());
+}
+
+bool wxCDAudio::Play(wxUint8 beg_track, wxUint8 end_track)
+{
+ wxCDtime beg_play = GetToc().GetTrackPos(beg_track);
+ wxCDtime end_play;
+
+ if (end_track)
+ end_play = GetToc().GetTrackPos(end_track);
+ else
+ end_play = GetToc().GetTotalTime();
+ return Play(beg_play, end_play);
+}
--- /dev/null
+////////////////////////////////////////////////////////////////////////////////
+// Name: cdlinux.cpp
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: 1997
+// Updated: 1998
+// Copyright: (C) 1997, 1998, Guilhem Lavaux
+// CVS Id: $Id$
+// License: wxWindows license
+////////////////////////////////////////////////////////////////////////////////
+#ifdef __GNUG__
+#pragma implementation "cdunix.h"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+#endif
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// ---------------------------------------------------------------------------
+// MMedia headers
+// ---------------------------------------------------------------------------
+
+#include "wx/mmedia/cdbase.h"
+#include "wx/mmedia/cdunix.h"
+
+// ---------------------------------------------------------------------------
+// System headers
+// ---------------------------------------------------------------------------
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#ifdef __linux__
+#include <linux/cdrom.h>
+#else
+// For Solaris
+#include <sys/cdio.h>
+#endif
+
+// ---------------------------------------------------------------------------
+// Implementation
+// ---------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxCDAudioLinux, wxCDAudio)
+
+wxCDAudioLinux::wxCDAudioLinux()
+ : wxCDAudio(), m_fd(-1)
+{
+ OpenDevice("/dev/cdrom");
+}
+
+wxCDAudioLinux::wxCDAudioLinux(const wxString& dev_name)
+ : wxCDAudio(), m_fd(-1)
+{
+ OpenDevice(dev_name);
+}
+
+wxCDAudioLinux::~wxCDAudioLinux()
+{
+ if (m_fd != -1) {
+ close(m_fd);
+ wxDELETE(m_trksize);
+ wxDELETE(m_trkpos);
+ }
+}
+
+void wxCDAudioLinux::OpenDevice(const wxString& dev_name)
+{
+ struct cdrom_tocentry entry, old_entry;
+ struct cdrom_tochdr diskinf;
+ struct cdrom_msf0 *msf = &entry.cdte_addr.msf,
+ *old_msf = &old_entry.cdte_addr.msf;
+ wxCDtime *the_track;
+ wxCDtime tot_tm;
+ wxUint8 nb_tracks, i;
+ int hour, minute, second;
+
+ if (m_fd != -1)
+ return;
+
+ m_fd = open(dev_name.mb_str(), O_RDONLY);
+ if (m_fd == -1) {
+ m_toc = NULL;
+ return;
+ }
+ m_status = STOPPED;
+
+ ioctl(m_fd, CDROMREADTOCHDR, &diskinf);
+
+ nb_tracks = diskinf.cdth_trk1-diskinf.cdth_trk0+1;
+ m_trksize = new wxCDtime[nb_tracks+1];
+ m_trkpos = new wxCDtime[nb_tracks+1];
+
+ old_msf->minute = 0;
+ old_msf->second = 0;
+ for (i=diskinf.cdth_trk0;i<=diskinf.cdth_trk1;i++) {
+ entry.cdte_track = i;
+ entry.cdte_format = CDROM_MSF;
+ ioctl(m_fd, CDROMREADTOCENTRY, &entry);
+
+ minute = msf->minute - old_msf->minute;
+ second = msf->second - old_msf->second;
+ if (second < 0) {
+ minute--;
+ second += 60;
+ }
+
+ hour = minute / 60;
+ minute %= 60;
+
+ the_track = &m_trksize[i-diskinf.cdth_trk0];
+ the_track->track = i-diskinf.cdth_trk0;
+ the_track->hour = hour;
+ the_track->min = minute;
+ the_track->sec = second;
+
+ the_track = &m_trkpos[i-diskinf.cdth_trk0];
+ the_track->track = i-diskinf.cdth_trk0;
+ the_track->hour = old_msf->minute / 60;
+ the_track->min = old_msf->minute % 60;
+ the_track->sec = old_msf->second;
+ old_entry = entry;
+ }
+
+ entry.cdte_track = CDROM_LEADOUT;
+ entry.cdte_format = CDROM_MSF;
+ ioctl(m_fd, CDROMREADTOCENTRY, &entry);
+
+ tot_tm.track = nb_tracks;
+ tot_tm.hour = msf->minute / 60;
+ tot_tm.min = msf->minute % 60;
+ tot_tm.sec = msf->second % 60;
+
+ m_trksize[nb_tracks].track = nb_tracks;
+ minute = msf->minute - old_msf->minute;
+ second = msf->second - old_msf->second;
+ if (second < 0) {
+ minute--;
+ second += 60;
+ }
+ hour = minute / 60;
+ minute %= 60;
+
+ m_trksize[nb_tracks].hour = hour;
+ m_trksize[nb_tracks].min = minute;
+ m_trksize[nb_tracks].sec = second;
+ m_trkpos[nb_tracks].track = nb_tracks;
+ m_trkpos[nb_tracks].hour = old_msf->minute / 60;
+ m_trkpos[nb_tracks].min = old_msf->minute % 60;
+ m_trkpos[nb_tracks].sec = old_msf->second;
+
+ m_toc = new CDtoc(tot_tm, m_trksize, m_trkpos);
+}
+
+bool wxCDAudioLinux::Play(const wxCDtime& beg_time, const wxCDtime& end_time)
+{
+ struct cdrom_msf track_msf;
+
+ track_msf.cdmsf_min0 = beg_time.hour * 60 + beg_time.min;
+ track_msf.cdmsf_sec0 = beg_time.sec;
+ track_msf.cdmsf_frame0 = 0;
+ track_msf.cdmsf_min1 = end_time.hour * 60 + end_time.min;
+ track_msf.cdmsf_sec1 = end_time.sec;
+ track_msf.cdmsf_frame1 = 0;
+ return (ioctl(m_fd, CDROMPLAYMSF, &track_msf) != -1);
+}
+
+bool wxCDAudioLinux::Pause()
+{
+ return (ioctl(m_fd, CDROMPAUSE, 0) != -1);
+}
+
+bool wxCDAudioLinux::Resume()
+{
+ return (ioctl(m_fd, CDROMRESUME, 0) != -1);
+}
+
+wxCDAudio::CDstatus wxCDAudioLinux::GetStatus()
+{
+ struct cdrom_subchnl subchnl;
+ ioctl(m_fd, CDROMSUBCHNL, &subchnl);
+ switch (subchnl.cdsc_audiostatus) {
+ case CDROM_AUDIO_PLAY: return PLAYING;
+ case CDROM_AUDIO_PAUSED: return PAUSED;
+ case CDROM_AUDIO_COMPLETED: return STOPPED;
+ }
+
+ return STOPPED;
+}
+
+wxCDtime wxCDAudioLinux::GetTime()
+{
+ wxCDtime cdtime;
+ struct cdrom_subchnl subchnl;
+
+ ioctl(m_fd, CDROMSUBCHNL, &subchnl);
+ cdtime.track = subchnl.cdsc_trk;
+ cdtime.min = subchnl.cdsc_reladdr.msf.minute;
+ cdtime.hour = cdtime.min / 60;
+ cdtime.min %= 60;
+ cdtime.sec = subchnl.cdsc_reladdr.msf.second;
+
+ return cdtime;
+}
+
+wxCDAudio::CDtoc& wxCDAudioLinux::GetToc()
+{
+ return *m_toc;
+}
--- /dev/null
+////////////////////////////////////////////////////////////////////////////////
+// Name: cdwin.cpp
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: 1997
+// Updated: 1998
+// Copyright: (C) 1997, 1998, Guilhem Lavaux
+// License: wxWindows license
+////////////////////////////////////////////////////////////////////////////////
+#ifdef __GNUG__
+#pragma implementation "cdwin.h"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+#endif
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifdef __WINDOWS__
+
+// ---------------------------------------------------------------------------
+// System headers
+// ---------------------------------------------------------------------------
+
+#include <windows.h>
+#include <stdio.h>
+#include <mmsystem.h>
+
+// ---------------------------------------------------------------------------
+// MMedia headers
+// ---------------------------------------------------------------------------
+
+#define WXMMEDIA_INTERNAL
+#include "wx/mmedia/cdbase.h"
+#include "wx/mmedia/cdwin.h"
+
+// ---------------------------------------------------------------------------
+// Implementation
+// ---------------------------------------------------------------------------
+
+wxCDAudioWin::wxCDAudioWin(void)
+ : wxCDAudio(), m_trksize(NULL), m_trkpos(NULL), m_ok(TRUE), m_toc(NULL)
+{
+ MCI_OPEN_PARMS open_struct;
+ MCI_SET_PARMS set_struct;
+ DWORD ret;
+
+ m_internal = new CDAW_Internal;
+ open_struct.lpstrDeviceType = "cdaudio";
+ ret = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE,
+ (DWORD)&open_struct);
+ if (ret) {
+ m_ok = FALSE;
+ return;
+ }
+ m_internal->dev_id = open_struct.wDeviceID;
+
+ set_struct.dwTimeFormat = MCI_FORMAT_MSF;
+ ret = mciSendCommand(m_internal->dev_id, MCI_SET, MCI_SET_TIME_FORMAT,
+ (DWORD)(LPVOID)&set_struct);
+
+ PrepareToc();
+
+ set_struct.dwTimeFormat = MCI_FORMAT_TMSF;
+ ret = mciSendCommand(m_internal->dev_id, MCI_SET, MCI_SET_TIME_FORMAT,
+ (DWORD)(LPVOID)&set_struct);
+}
+
+wxCDAudioWin::~wxCDAudioWin(void)
+{
+ if (m_ok) {
+ mciSendCommand(m_internal->dev_id, MCI_CLOSE, 0, NULL);
+ delete m_toc;
+ delete[] m_trksize;
+ delete[] m_trkpos;
+ }
+ delete m_internal;
+}
+
+void wxCDAudioWin::PrepareToc(void)
+{
+ MCI_STATUS_PARMS status_struct;
+ wxUint16 i, nb_m_trksize;
+ wxCDtime total_time, *trk;
+ DWORD ret, tmem;
+
+ if (!m_ok)
+ return;
+
+ status_struct.dwItem = MCI_STATUS_NUMBER_OF_TRACKS;
+ ret = mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
+ (DWORD)&status_struct);
+ nb_m_trksize = status_struct.dwReturn;
+
+ m_trksize = new wxCDtime[nb_m_trksize+1];
+ m_trkpos = new wxCDtime[nb_m_trksize+1];
+
+ status_struct.dwItem = MCI_STATUS_LENGTH;
+ ret = mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
+ (DWORD)&status_struct);
+ total_time.track = nb_m_trksize;
+ tmem = status_struct.dwReturn;
+ total_time.min = MCI_MSF_MINUTE(tmem);
+ total_time.sec = MCI_MSF_SECOND(tmem);
+ total_time.hour = total_time.min / 60;
+ total_time.min %= 60;
+
+ for (i=1;i<=nb_m_trksize;i++) {
+ status_struct.dwItem = MCI_STATUS_POSITION;
+ status_struct.dwTrack = i;
+ ret = mciSendCommand(m_internal->dev_id, MCI_STATUS,
+ MCI_STATUS_ITEM | MCI_TRACK,
+ (DWORD)(LPVOID)&status_struct);
+ tmem = status_struct.dwReturn;
+
+ trk = &m_trkpos[i];
+ trk->track = i;
+ trk->min = MCI_MSF_MINUTE(tmem);
+ trk->sec = MCI_MSF_SECOND(tmem);
+ trk->hour = trk->min / 60;
+ trk->min %= 60;
+
+ status_struct.dwItem = MCI_STATUS_LENGTH;
+ status_struct.dwTrack = i;
+ ret = mciSendCommand(m_internal->dev_id, MCI_STATUS,
+ MCI_STATUS_ITEM | MCI_TRACK,
+ (DWORD)(LPVOID)&status_struct);
+ tmem = status_struct.dwReturn;
+
+ trk = &m_trksize[i];
+ trk->track = i;
+ trk->min = MCI_MSF_MINUTE(tmem);
+ trk->sec = MCI_MSF_SECOND(tmem);
+ trk->hour = trk->min / 60;
+ trk->min %= 60;
+ }
+
+ m_toc = new CDtoc(total_time, m_trksize, m_trkpos);
+}
+
+bool wxCDAudioWin::Play(const wxCDtime& beg_time, const wxCDtime& end_time)
+{
+ DWORD tmsf;
+ MCI_PLAY_PARMS play_struct;
+
+ if (!m_ok)
+ return FALSE;
+
+ tmsf = MCI_MAKE_TMSF(beg_time.track, beg_time.min,
+ beg_time.sec, 0);
+ play_struct.dwFrom = tmsf;
+ tmsf = MCI_MAKE_TMSF(end_time.track, end_time.min,
+ end_time.sec, 0);
+ play_struct.dwTo = tmsf;
+
+ mciSendCommand(m_internal->dev_id, MCI_PLAY, 0, (DWORD)&play_struct);
+ return TRUE;
+}
+
+bool wxCDAudioWin::Pause(void)
+{
+ if (!m_ok)
+ return FALSE;
+
+ return (mciSendCommand(m_internal->dev_id, MCI_PAUSE, 0, 0) == 0);
+}
+
+bool wxCDAudioWin::Resume(void)
+{
+ if (!m_ok)
+ return FALSE;
+
+ return (mciSendCommand(m_internal->dev_id, MCI_RESUME, 0, 0) == 0);
+}
+
+wxCDAudio::CDstatus wxCDAudioWin::GetStatus(void)
+{
+ MCI_STATUS_PARMS status_struct;
+
+ if (!m_ok)
+ return STOPPED;
+
+ status_struct.dwItem = MCI_STATUS_MODE;
+ mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
+ (DWORD)&status_struct);
+ switch (status_struct.dwReturn) {
+ case MCI_MODE_PAUSE:
+ return PAUSED;
+ case MCI_MODE_PLAY:
+ return PLAYING;
+ }
+ return STOPPED;
+}
+
+wxCDtime wxCDAudioWin::GetTime(void)
+{
+ MCI_STATUS_PARMS status_struct;
+ wxCDtime cd_time = {-1, -1, -1, -1};
+
+ if (!m_ok)
+ return cd_time;
+
+ status_struct.dwItem = MCI_STATUS_TIME_FORMAT;
+ mciSendCommand(m_internal->dev_id, MCI_STATUS, MCI_STATUS_ITEM,
+ (DWORD)&status_struct);
+ cd_time.track = MCI_TMSF_TRACK(status_struct.dwReturn);
+ cd_time.min = MCI_TMSF_MINUTE(status_struct.dwReturn);
+ cd_time.sec = MCI_TMSF_SECOND(status_struct.dwReturn);
+ cd_time.hour = cd_time.min / 60;
+ cd_time.min %= 60;
+ return cd_time;
+}
+
+const wxCDAudio::CDtoc& wxCDAudioWin::GetToc(void)
+{
+ return *m_toc;
+}
+
+#endif
+ // __WINDOWS__
--- /dev/null
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use. Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ */
+
+#include <wx/wxprec.h>
+
+/*
+ * g711.c
+ *
+ * u-law, A-law and linear PCM conversions.
+ */
+#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */
+#define QUANT_MASK (0xf) /* Quantization field mask. */
+#define NSEGS (8) /* Number of A-law segments. */
+#define SEG_SHIFT (4) /* Left shift for segment number. */
+#define SEG_MASK (0x70) /* Segment field mask. */
+
+static short seg_end[8] = {0xFF, 0x1FF, 0x3FF, 0x7FF,
+ 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF};
+
+/* copy from CCITT G.711 specifications */
+unsigned char _u2a[128] = { /* u- to A-law conversions */
+ 1, 1, 2, 2, 3, 3, 4, 4,
+ 5, 5, 6, 6, 7, 7, 8, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 27, 29, 31, 33, 34, 35, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44,
+ 46, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62,
+ 64, 65, 66, 67, 68, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79,
+ 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 96,
+ 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 111, 112,
+ 113, 114, 115, 116, 117, 118, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128};
+
+unsigned char _a2u[128] = { /* A- to u-law conversions */
+ 1, 3, 5, 7, 9, 11, 13, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 32, 33, 33, 34, 34, 35, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43,
+ 44, 45, 46, 47, 48, 48, 49, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87,
+ 88, 89, 90, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127};
+
+static int
+search(
+ int val,
+ short *table,
+ int size)
+{
+ int i;
+
+ for (i = 0; i < size; i++) {
+ if (val <= *table++)
+ return (i);
+ }
+ return (size);
+}
+
+/*
+ * linear2alaw() - Convert a 16-bit linear PCM value to 8-bit A-law
+ *
+ * linear2alaw() accepts an 16-bit integer and encodes it as A-law data.
+ *
+ * Linear Input Code Compressed Code
+ * ------------------------ ---------------
+ * 0000000wxyza 000wxyz
+ * 0000001wxyza 001wxyz
+ * 000001wxyzab 010wxyz
+ * 00001wxyzabc 011wxyz
+ * 0001wxyzabcd 100wxyz
+ * 001wxyzabcde 101wxyz
+ * 01wxyzabcdef 110wxyz
+ * 1wxyzabcdefg 111wxyz
+ *
+ * For further information see John C. Bellamy's Digital Telephony, 1982,
+ * John Wiley & Sons, pps 98-111 and 472-476.
+ */
+unsigned char
+linear2alaw(
+ int pcm_val) /* 2's complement (16-bit range) */
+{
+ int mask;
+ int seg;
+ unsigned char aval;
+
+ if (pcm_val >= 0) {
+ mask = 0xD5; /* sign (7th) bit = 1 */
+ } else {
+ mask = 0x55; /* sign bit = 0 */
+ pcm_val = -pcm_val - 8;
+ }
+
+ /* Convert the scaled magnitude to segment number. */
+ seg = search(pcm_val, seg_end, 8);
+
+ /* Combine the sign, segment, and quantization bits. */
+
+ if (seg >= 8) /* out of range, return maximum value. */
+ return (0x7F ^ mask);
+ else {
+ aval = seg << SEG_SHIFT;
+ if (seg < 2)
+ aval |= (pcm_val >> 4) & QUANT_MASK;
+ else
+ aval |= (pcm_val >> (seg + 3)) & QUANT_MASK;
+ return (aval ^ mask);
+ }
+}
+
+/*
+ * alaw2linear() - Convert an A-law value to 16-bit linear PCM
+ *
+ */
+int
+alaw2linear(
+ unsigned char a_val)
+{
+ int t;
+ int seg;
+
+ a_val ^= 0x55;
+
+ t = (a_val & QUANT_MASK) << 4;
+ seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
+ switch (seg) {
+ case 0:
+ t += 8;
+ break;
+ case 1:
+ t += 0x108;
+ break;
+ default:
+ t += 0x108;
+ t <<= seg - 1;
+ }
+ return ((a_val & SIGN_BIT) ? t : -t);
+}
+
+#define BIAS (0x84) /* Bias for linear code. */
+
+/*
+ * linear2ulaw() - Convert a linear PCM value to u-law
+ *
+ * In order to simplify the encoding process, the original linear magnitude
+ * is biased by adding 33 which shifts the encoding range from (0 - 8158) to
+ * (33 - 8191). The result can be seen in the following encoding table:
+ *
+ * Biased Linear Input Code Compressed Code
+ * ------------------------ ---------------
+ * 00000001wxyza 000wxyz
+ * 0000001wxyzab 001wxyz
+ * 000001wxyzabc 010wxyz
+ * 00001wxyzabcd 011wxyz
+ * 0001wxyzabcde 100wxyz
+ * 001wxyzabcdef 101wxyz
+ * 01wxyzabcdefg 110wxyz
+ * 1wxyzabcdefgh 111wxyz
+ *
+ * Each biased linear code has a leading 1 which identifies the segment
+ * number. The value of the segment number is equal to 7 minus the number
+ * of leading 0's. The quantization interval is directly available as the
+ * four bits wxyz. * The trailing bits (a - h) are ignored.
+ *
+ * Ordinarily the complement of the resulting code word is used for
+ * transmission, and so the code word is complemented before it is returned.
+ *
+ * For further information see John C. Bellamy's Digital Telephony, 1982,
+ * John Wiley & Sons, pps 98-111 and 472-476.
+ */
+unsigned char
+linear2ulaw(
+ int pcm_val) /* 2's complement (16-bit range) */
+{
+ int mask;
+ int seg;
+ unsigned char uval;
+
+ /* Get the sign and the magnitude of the value. */
+ if (pcm_val < 0) {
+ pcm_val = BIAS - pcm_val;
+ mask = 0x7F;
+ } else {
+ pcm_val += BIAS;
+ mask = 0xFF;
+ }
+
+ /* Convert the scaled magnitude to segment number. */
+ seg = search(pcm_val, seg_end, 8);
+
+ /*
+ * Combine the sign, segment, quantization bits;
+ * and complement the code word.
+ */
+ if (seg >= 8) /* out of range, return maximum value. */
+ return (0x7F ^ mask);
+ else {
+ uval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0xF);
+ return (uval ^ mask);
+ }
+
+}
+
+/*
+ * ulaw2linear() - Convert a u-law value to 16-bit linear PCM
+ *
+ * First, a biased linear code is derived from the code word. An unbiased
+ * output can then be obtained by subtracting 33 from the biased code.
+ *
+ * Note that this function expects to be passed the complement of the
+ * original code word. This is in keeping with ISDN conventions.
+ */
+int
+ulaw2linear(
+ unsigned char u_val)
+{
+ int t;
+
+ /* Complement to obtain normal u-law value. */
+ u_val = ~u_val;
+
+ /*
+ * Extract and bias the quantization bits. Then
+ * shift up by the segment number and subtract out the bias.
+ */
+ t = ((u_val & QUANT_MASK) << 3) + BIAS;
+ t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;
+
+ return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS));
+}
+
+/* A-law to u-law conversion */
+unsigned char
+alaw2ulaw(
+ unsigned char aval)
+{
+ aval &= 0xff;
+ return ((aval & 0x80) ? (0xFF ^ _a2u[aval ^ 0xD5]) :
+ (0x7F ^ _a2u[aval ^ 0x55]));
+}
+
+/* u-law to A-law conversion */
+unsigned char
+ulaw2alaw(
+ unsigned char uval)
+{
+ uval &= 0xff;
+ return ((uval & 0x80) ? (0xD5 ^ (_u2a[0xFF ^ uval] - 1)) :
+ (0x55 ^ (_u2a[0x7F ^ uval] - 1)));
+}
--- /dev/null
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use. Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ */
+
+#include <wx/wxprec.h>
+
+/*
+ * g721.c
+ *
+ * Description:
+ *
+ * g721_encoder(), g721_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.721 ADPCM
+ * coding algorithm. Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which
+ * take advantage of work station attributes, such as hardware 2's
+ * complement arithmetic and large memory. Specifically, certain time
+ * consuming operations such as multiplications are replaced
+ * with lookup tables and software 2's complement operations are
+ * replaced with hardware 2's complement.
+ *
+ * The deviation from the bit level specification (lookup tables)
+ * preserves the bit level performance specifications.
+ *
+ * As outlined in the G.721 Recommendation, the algorithm is broken
+ * down into modules. Each section of code below is preceded by
+ * the name of the module which it is implementing.
+ *
+ */
+#include "wx/mmedia/internal/g72x.h"
+
+static short qtab_721[7] = {-124, 80, 178, 246, 300, 349, 400};
+/*
+ * Maps G.721 code word to reconstructed scale factor normalized log
+ * magnitude values.
+ */
+static short _dqlntab[16] = {-2048, 4, 135, 213, 273, 323, 373, 425,
+ 425, 373, 323, 273, 213, 135, 4, -2048};
+
+/* Maps G.721 code word to log of scale factor multiplier. */
+static short _witab[16] = {-12, 18, 41, 64, 112, 198, 355, 1122,
+ 1122, 355, 198, 112, 64, 41, 18, -12};
+/*
+ * Maps G.721 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+static short _fitab[16] = {0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00,
+ 0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0};
+
+/*
+ * g721_encoder()
+ *
+ * Encodes the input vale of linear PCM, A-law or u-law data sl and returns
+ * the resulting code. -1 is returned for unknown input coding value.
+ */
+int
+g721_encoder(
+ int sl,
+ int in_coding,
+ struct g72x_state *state_ptr)
+{
+ short sezi, se, sez; /* ACCUM */
+ short d; /* SUBTA */
+ short sr; /* ADDB */
+ short y; /* MIX */
+ short dqsez; /* ADDC */
+ short dq, i;
+
+ switch (in_coding) { /* linearize input sample to 14-bit PCM */
+ case AUDIO_ENCODING_ALAW:
+ sl = alaw2linear(sl) >> 2;
+ break;
+ case AUDIO_ENCODING_ULAW:
+ sl = ulaw2linear(sl) >> 2;
+ break;
+ case AUDIO_ENCODING_LINEAR:
+ sl = ((short)sl) >> 2; /* 14-bit dynamic range */
+ break;
+ default:
+ return (-1);
+ }
+
+ sezi = predictor_zero(state_ptr);
+ sez = sezi >> 1;
+ se = (sezi + predictor_pole(state_ptr)) >> 1; /* estimated signal */
+
+ d = sl - se; /* estimation difference */
+
+ /* quantize the prediction difference */
+ y = step_size(state_ptr); /* quantizer step size */
+ i = quantize(d, y, qtab_721, 7); /* i = ADPCM code */
+
+ dq = reconstruct(i & 8, _dqlntab[i], y); /* quantized est diff */
+
+ sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconst. signal */
+
+ dqsez = sr + sez - se; /* pole prediction diff. */
+
+ update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
+
+ return (i);
+}
+
+/*
+ * g721_decoder()
+ *
+ * Description:
+ *
+ * Decodes a 4-bit code of G.721 encoded data of i and
+ * returns the resulting linear PCM, A-law or u-law value.
+ * return -1 for unknown out_coding value.
+ */
+int
+g721_decoder(
+ int i,
+ int out_coding,
+ struct g72x_state *state_ptr)
+{
+ short sezi, sei, sez, se; /* ACCUM */
+ short y; /* MIX */
+ short sr; /* ADDB */
+ short dq;
+ short dqsez;
+
+ i &= 0x0f; /* mask to get proper bits */
+ sezi = predictor_zero(state_ptr);
+ sez = sezi >> 1;
+ sei = sezi + predictor_pole(state_ptr);
+ se = sei >> 1; /* se = estimated signal */
+
+ y = step_size(state_ptr); /* dynamic quantizer step size */
+
+ dq = reconstruct(i & 0x08, _dqlntab[i], y); /* quantized diff. */
+
+ sr = (dq < 0) ? (se - (dq & 0x3FFF)) : se + dq; /* reconst. signal */
+
+ dqsez = sr - se + sez; /* pole prediction diff. */
+
+ update(4, y, _witab[i] << 5, _fitab[i], dq, sr, dqsez, state_ptr);
+
+ switch (out_coding) {
+ case AUDIO_ENCODING_ALAW:
+ return (tandem_adjust_alaw(sr, se, y, i, 8, qtab_721));
+ case AUDIO_ENCODING_ULAW:
+ return (tandem_adjust_ulaw(sr, se, y, i, 8, qtab_721));
+ case AUDIO_ENCODING_LINEAR:
+ return (sr << 2); /* sr was 14-bit dynamic range */
+ default:
+ return (-1);
+ }
+}
--- /dev/null
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use. Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ */
+
+/*
+ * g723_24.c
+ *
+ * Description:
+ *
+ * g723_24_encoder(), g723_24_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.723 24 Kbps
+ * ADPCM coding algorithm. Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which take advantage
+ * of workstation attributes, such as hardware 2's complement arithmetic.
+ *
+ */
+#include <wx/wxprec.h>
+#include "wx/mmedia/internal/g72x.h"
+
+/*
+ * Maps G.723_24 code word to reconstructed scale factor normalized log
+ * magnitude values.
+ */
+static short _dqlntab[8] = {-2048, 135, 273, 373, 373, 273, 135, -2048};
+
+/* Maps G.723_24 code word to log of scale factor multiplier. */
+static short _witab[8] = {-128, 960, 4384, 18624, 18624, 4384, 960, -128};
+
+/*
+ * Maps G.723_24 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+static short _fitab[8] = {0, 0x200, 0x400, 0xE00, 0xE00, 0x400, 0x200, 0};
+
+static short qtab_723_24[3] = {8, 218, 331};
+
+/*
+ * g723_24_encoder()
+ *
+ * Encodes a linear PCM, A-law or u-law input sample and returns its 3-bit code.
+ * Returns -1 if invalid input coding value.
+ */
+int
+g723_24_encoder(
+ int sl,
+ int in_coding,
+ struct g72x_state *state_ptr)
+{
+ short sei, sezi, se, sez; /* ACCUM */
+ short d; /* SUBTA */
+ short y; /* MIX */
+ short sr; /* ADDB */
+ short dqsez; /* ADDC */
+ short dq, i;
+
+ switch (in_coding) { /* linearize input sample to 14-bit PCM */
+ case AUDIO_ENCODING_ALAW:
+ sl = alaw2linear(sl) >> 2;
+ break;
+ case AUDIO_ENCODING_ULAW:
+ sl = ulaw2linear(sl) >> 2;
+ break;
+ case AUDIO_ENCODING_LINEAR:
+ sl = ((short)sl) >> 2; /* sl of 14-bit dynamic range */
+ break;
+ default:
+ return (-1);
+ }
+
+ sezi = predictor_zero(state_ptr);
+ sez = sezi >> 1;
+ sei = sezi + predictor_pole(state_ptr);
+ se = sei >> 1; /* se = estimated signal */
+
+ d = sl - se; /* d = estimation diff. */
+
+ /* quantize prediction difference d */
+ y = step_size(state_ptr); /* quantizer step size */
+ i = quantize(d, y, qtab_723_24, 3); /* i = ADPCM code */
+ dq = reconstruct(i & 4, _dqlntab[i], y); /* quantized diff. */
+
+ sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq; /* reconstructed signal */
+
+ dqsez = sr + sez - se; /* pole prediction diff. */
+
+ update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+ return (i);
+}
+
+/*
+ * g723_24_decoder()
+ *
+ * Decodes a 3-bit CCITT G.723_24 ADPCM code and returns
+ * the resulting 16-bit linear PCM, A-law or u-law sample value.
+ * -1 is returned if the output coding is unknown.
+ */
+int
+g723_24_decoder(
+ int i,
+ int out_coding,
+ struct g72x_state *state_ptr)
+{
+ short sezi, sei, sez, se; /* ACCUM */
+ short y; /* MIX */
+ short sr; /* ADDB */
+ short dq;
+ short dqsez;
+
+ i &= 0x07; /* mask to get proper bits */
+ sezi = predictor_zero(state_ptr);
+ sez = sezi >> 1;
+ sei = sezi + predictor_pole(state_ptr);
+ se = sei >> 1; /* se = estimated signal */
+
+ y = step_size(state_ptr); /* adaptive quantizer step size */
+ dq = reconstruct(i & 0x04, _dqlntab[i], y); /* unquantize pred diff */
+
+ sr = (dq < 0) ? (se - (dq & 0x3FFF)) : (se + dq); /* reconst. signal */
+
+ dqsez = sr - se + sez; /* pole prediction diff. */
+
+ update(3, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+ switch (out_coding) {
+ case AUDIO_ENCODING_ALAW:
+ return (tandem_adjust_alaw(sr, se, y, i, 4, qtab_723_24));
+ case AUDIO_ENCODING_ULAW:
+ return (tandem_adjust_ulaw(sr, se, y, i, 4, qtab_723_24));
+ case AUDIO_ENCODING_LINEAR:
+ return (sr << 2); /* sr was of 14-bit dynamic range */
+ default:
+ return (-1);
+ }
+}
--- /dev/null
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use. Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ */
+
+/*
+ * g723_40.c
+ *
+ * Description:
+ *
+ * g723_40_encoder(), g723_40_decoder()
+ *
+ * These routines comprise an implementation of the CCITT G.723 40Kbps
+ * ADPCM coding algorithm. Essentially, this implementation is identical to
+ * the bit level description except for a few deviations which
+ * take advantage of workstation attributes, such as hardware 2's
+ * complement arithmetic.
+ *
+ * The deviation from the bit level specification (lookup tables),
+ * preserves the bit level performance specifications.
+ *
+ * As outlined in the G.723 Recommendation, the algorithm is broken
+ * down into modules. Each section of code below is preceded by
+ * the name of the module which it is implementing.
+ *
+ */
+#include <wx/wxprec.h>
+#include "wx/mmedia/internal/g72x.h"
+
+/*
+ * Maps G.723_40 code word to ructeconstructed scale factor normalized log
+ * magnitude values.
+ */
+static short _dqlntab[32] = {-2048, -66, 28, 104, 169, 224, 274, 318,
+ 358, 395, 429, 459, 488, 514, 539, 566,
+ 566, 539, 514, 488, 459, 429, 395, 358,
+ 318, 274, 224, 169, 104, 28, -66, -2048};
+
+/* Maps G.723_40 code word to log of scale factor multiplier. */
+static short _witab[32] = {448, 448, 768, 1248, 1280, 1312, 1856, 3200,
+ 4512, 5728, 7008, 8960, 11456, 14080, 16928, 22272,
+ 22272, 16928, 14080, 11456, 8960, 7008, 5728, 4512,
+ 3200, 1856, 1312, 1280, 1248, 768, 448, 448};
+
+/*
+ * Maps G.723_40 code words to a set of values whose long and short
+ * term averages are computed and then compared to give an indication
+ * how stationary (steady state) the signal is.
+ */
+static short _fitab[32] = {0, 0, 0, 0, 0, 0x200, 0x200, 0x200,
+ 0x200, 0x200, 0x400, 0x600, 0x800, 0xA00, 0xC00, 0xC00,
+ 0xC00, 0xC00, 0xA00, 0x800, 0x600, 0x400, 0x200, 0x200,
+ 0x200, 0x200, 0x200, 0, 0, 0, 0, 0};
+
+static short qtab_723_40[15] = {-122, -16, 68, 139, 198, 250, 298, 339,
+ 378, 413, 445, 475, 502, 528, 553};
+
+/*
+ * g723_40_encoder()
+ *
+ * Encodes a 16-bit linear PCM, A-law or u-law input sample and retuens
+ * the resulting 5-bit CCITT G.723 40Kbps code.
+ * Returns -1 if the input coding value is invalid.
+ */
+int
+g723_40_encoder(
+ int sl,
+ int in_coding,
+ struct g72x_state *state_ptr)
+{
+ short sei, sezi, se, sez; /* ACCUM */
+ short d; /* SUBTA */
+ short y; /* MIX */
+ short sr; /* ADDB */
+ short dqsez; /* ADDC */
+ short dq, i;
+
+ switch (in_coding) { /* linearize input sample to 14-bit PCM */
+ case AUDIO_ENCODING_ALAW:
+ sl = alaw2linear(sl) >> 2;
+ break;
+ case AUDIO_ENCODING_ULAW:
+ sl = ulaw2linear(sl) >> 2;
+ break;
+ case AUDIO_ENCODING_LINEAR:
+ sl = ((short) sl) >> 2; /* sl of 14-bit dynamic range */
+ break;
+ default:
+ return (-1);
+ }
+
+ sezi = predictor_zero(state_ptr);
+ sez = sezi >> 1;
+ sei = sezi + predictor_pole(state_ptr);
+ se = sei >> 1; /* se = estimated signal */
+
+ d = sl - se; /* d = estimation difference */
+
+ /* quantize prediction difference */
+ y = step_size(state_ptr); /* adaptive quantizer step size */
+ i = quantize(d, y, qtab_723_40, 15); /* i = ADPCM code */
+
+ dq = reconstruct(i & 0x10, _dqlntab[i], y); /* quantized diff */
+
+ sr = (dq < 0) ? se - (dq & 0x7FFF) : se + dq; /* reconstructed signal */
+
+ dqsez = sr + sez - se; /* dqsez = pole prediction diff. */
+
+ update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+ return (i);
+}
+
+/*
+ * g723_40_decoder()
+ *
+ * Decodes a 5-bit CCITT G.723 40Kbps code and returns
+ * the resulting 16-bit linear PCM, A-law or u-law sample value.
+ * -1 is returned if the output coding is unknown.
+ */
+int
+g723_40_decoder(
+ int i,
+ int out_coding,
+ struct g72x_state *state_ptr)
+{
+ short sezi, sei, sez, se; /* ACCUM */
+ short y; /* MIX */
+ short sr; /* ADDB */
+ short dq;
+ short dqsez;
+
+ i &= 0x1f; /* mask to get proper bits */
+ sezi = predictor_zero(state_ptr);
+ sez = sezi >> 1;
+ sei = sezi + predictor_pole(state_ptr);
+ se = sei >> 1; /* se = estimated signal */
+
+ y = step_size(state_ptr); /* adaptive quantizer step size */
+ dq = reconstruct(i & 0x10, _dqlntab[i], y); /* estimation diff. */
+
+ sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq); /* reconst. signal */
+
+ dqsez = sr - se + sez; /* pole prediction diff. */
+
+ update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
+
+ switch (out_coding) {
+ case AUDIO_ENCODING_ALAW:
+ return (tandem_adjust_alaw(sr, se, y, i, 0x10, qtab_723_40));
+ case AUDIO_ENCODING_ULAW:
+ return (tandem_adjust_ulaw(sr, se, y, i, 0x10, qtab_723_40));
+ case AUDIO_ENCODING_LINEAR:
+ return (sr << 2); /* sr was of 14-bit dynamic range */
+ default:
+ return (-1);
+ }
+}
--- /dev/null
+/*
+ * This source code is a product of Sun Microsystems, Inc. and is provided
+ * for unrestricted use. Users may copy or modify this source code without
+ * charge.
+ *
+ * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING
+ * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
+ *
+ * Sun source code is provided with no support and without any obligation on
+ * the part of Sun Microsystems, Inc. to assist in its use, correction,
+ * modification or enhancement.
+ *
+ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
+ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE
+ * OR ANY PART THEREOF.
+ *
+ * In no event will Sun Microsystems, Inc. be liable for any lost revenue
+ * or profits or other special, indirect and consequential damages, even if
+ * Sun has been advised of the possibility of such damages.
+ *
+ * Sun Microsystems, Inc.
+ * 2550 Garcia Avenue
+ * Mountain View, California 94043
+ */
+
+/*
+ * g72x.c
+ *
+ * Common routines for G.721 and G.723 conversions.
+ */
+
+#include <stdlib.h>
+#include "wx/mmedia/internal/g72x.h"
+
+static short power2[15] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80,
+ 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000};
+
+/*
+ * quan()
+ *
+ * quantizes the input val against the table of size short integers.
+ * It returns i if table[i - 1] <= val < table[i].
+ *
+ * Using linear search for simple coding.
+ */
+static int
+quan(
+ int val,
+ short *table,
+ int size)
+{
+ int i;
+
+ for (i = 0; i < size; i++)
+ if (val < *table++)
+ break;
+ return (i);
+}
+
+static char quan2_tab[65536];
+static short base2_tab[65536];
+static int init_tabs_done = 0;
+
+inline char quan2 (unsigned short val)
+{
+ return quan2_tab[val];
+}
+
+inline short base2 (unsigned short val)
+{
+ return base2_tab[val];
+}
+
+static void init_quan2_tab (void)
+{
+ long i;
+
+ for (i = 0; i < 65536; i++) {
+ quan2_tab[i] = quan (i, power2, 15);
+ };
+}
+
+static void init_base2_tab (void)
+{
+ long i;
+ short exp;
+
+ for (i = 0; i < 65536; i++) {
+ exp = quan2 (short (i));
+ base2_tab[i] = short ((exp << 6) + ((i << 6) >> exp));
+ };
+}
+
+static void init_tabs (void)
+{
+ if (init_tabs_done) return;
+
+ init_quan2_tab();
+ init_base2_tab();
+
+ init_tabs_done = 1;
+}
+
+/*
+ * fmult()
+ *
+ * returns the integer product of the 14-bit integer "an" and
+ * "floating point" representation (4-bit exponent, 6-bit mantessa) "srn".
+ */
+static int
+fmult(
+ int an,
+ int srn)
+{
+ short anmag, anexp, anmant;
+ short wanexp, wanmant;
+ short retval;
+
+ anmag = (an > 0) ? an : ((-an) & 0x1FFF);
+ anexp = quan2(anmag) - 6;
+ anmant = (anmag == 0) ? 32 :
+ (anexp >= 0) ? anmag >> anexp : anmag << -anexp;
+ wanexp = anexp + ((srn >> 6) & 0xF) - 13;
+
+ wanmant = (anmant * (srn & 077) + 0x30) >> 4;
+ retval = (wanexp >= 0) ? ((wanmant << wanexp) & 0x7FFF) :
+ (wanmant >> -wanexp);
+
+ return (((an ^ srn) < 0) ? -retval : retval);
+}
+
+/*
+ * g72x_init_state()
+ *
+ * This routine initializes and/or resets the g72x_state structure
+ * pointed to by 'state_ptr'.
+ * All the initial state values are specified in the CCITT G.721 document.
+ */
+void
+g72x_init_state(
+ struct g72x_state *state_ptr)
+{
+ int cnta;
+
+ init_tabs ();
+
+ state_ptr->yl = 34816;
+ state_ptr->yu = 544;
+ state_ptr->dms = 0;
+ state_ptr->dml = 0;
+ state_ptr->ap = 0;
+ for (cnta = 0; cnta < 2; cnta++) {
+ state_ptr->a[cnta] = 0;
+ state_ptr->pk[cnta] = 0;
+ state_ptr->sr[cnta] = 32;
+ }
+ for (cnta = 0; cnta < 6; cnta++) {
+ state_ptr->b[cnta] = 0;
+ state_ptr->dq[cnta] = 32;
+ }
+ state_ptr->td = 0;
+}
+
+/*
+ * predictor_zero()
+ *
+ * computes the estimated signal from 6-zero predictor.
+ *
+ */
+int
+predictor_zero(
+ struct g72x_state *state_ptr)
+{
+ int i;
+ int sezi;
+
+ sezi = fmult(state_ptr->b[0] >> 2, state_ptr->dq[0]);
+ for (i = 1; i < 6; i++) /* ACCUM */
+ sezi += fmult(state_ptr->b[i] >> 2, state_ptr->dq[i]);
+ return (sezi);
+}
+/*
+ * predictor_pole()
+ *
+ * computes the estimated signal from 2-pole predictor.
+ *
+ */
+int
+predictor_pole(
+ struct g72x_state *state_ptr)
+{
+ return (fmult(state_ptr->a[1] >> 2, state_ptr->sr[1]) +
+ fmult(state_ptr->a[0] >> 2, state_ptr->sr[0]));
+}
+/*
+ * step_size()
+ *
+ * computes the quantization step size of the adaptive quantizer.
+ *
+ */
+int
+step_size(
+ struct g72x_state *state_ptr)
+{
+ int y;
+ int dif;
+ int al;
+
+ if (state_ptr->ap >= 256)
+ return (state_ptr->yu);
+ else {
+ y = state_ptr->yl >> 6;
+ dif = state_ptr->yu - y;
+ al = state_ptr->ap >> 2;
+ if (dif > 0)
+ y += (dif * al) >> 6;
+ else if (dif < 0)
+ y += (dif * al + 0x3F) >> 6;
+ return (y);
+ }
+}
+
+/*
+ * quantize()
+ *
+ * Given a raw sample, 'd', of the difference signal and a
+ * quantization step size scale factor, 'y', this routine returns the
+ * ADPCM codeword to which that sample gets quantized. The step
+ * size scale factor division operation is done in the log base 2 domain
+ * as a subtraction.
+ */
+int
+quantize(
+ int d, /* Raw difference signal sample */
+ int y, /* Step size multiplier */
+ short *table, /* quantization table */
+ int size) /* table size of short integers */
+{
+ short dqm; /* Magnitude of 'd' */
+ short exp; /* Integer part of base 2 log of 'd' */
+ short mant; /* Fractional part of base 2 log */
+ short dl; /* Log of magnitude of 'd' */
+ short dln; /* Step size scale factor normalized log */
+ int i;
+
+ /*
+ * LOG
+ *
+ * Compute base 2 log of 'd', and store in 'dl'.
+ */
+ dqm = abs(d);
+ exp = quan2(dqm >> 1);
+ mant = ((dqm << 7) >> exp) & 0x7F; /* Fractional portion. */
+ dl = (exp << 7) + mant;
+
+ /*
+ * SUBTB
+ *
+ * "Divide" by step size multiplier.
+ */
+ dln = dl - (y >> 2);
+
+ /*
+ * QUAN
+ *
+ * Obtain codword i for 'd'.
+ */
+ i = quan(dln, table, size);
+ if (d < 0) /* take 1's complement of i */
+ return ((size << 1) + 1 - i);
+ else if (i == 0) /* take 1's complement of 0 */
+ return ((size << 1) + 1); /* new in 1988 */
+ else
+ return (i);
+}
+/*
+ * reconstruct()
+ *
+ * Returns reconstructed difference signal 'dq' obtained from
+ * codeword 'i' and quantization step size scale factor 'y'.
+ * Multiplication is performed in log base 2 domain as addition.
+ */
+int
+reconstruct(
+ int sign, /* 0 for non-negative value */
+ int dqln, /* G.72x codeword */
+ int y) /* Step size multiplier */
+{
+ short dql; /* Log of 'dq' magnitude */
+ short dex; /* Integer part of log */
+ short dqt;
+ short dq; /* Reconstructed difference signal sample */
+
+ dql = dqln + (y >> 2); /* ADDA */
+
+ if (dql < 0) {
+ return ((sign) ? -0x8000 : 0);
+ } else { /* ANTILOG */
+ dex = (dql >> 7) & 15;
+ dqt = 128 + (dql & 127);
+ dq = (dqt << 7) >> (14 - dex);
+ return ((sign) ? (dq - 0x8000) : dq);
+ }
+}
+
+
+/*
+ * update()
+ *
+ * updates the state variables for each output code
+ */
+void
+update(
+ int code_size, /* distinguish 723_40 with others */
+ int y, /* quantizer step size */
+ int wi, /* scale factor multiplier */
+ int fi, /* for long/short term energies */
+ int dq, /* quantized prediction difference */
+ int sr, /* reconstructed signal */
+ int dqsez, /* difference from 2-pole predictor */
+ struct g72x_state *state_ptr) /* coder state pointer */
+{
+ int cnt;
+ short mag; /* Adaptive predictor, FLOAT A */
+ short a2p; /* LIMC */
+ short a1ul; /* UPA1 */
+ short pks1; /* UPA2 */
+ short fa1;
+ char tr; /* tone/transition detector */
+ short ylint, thr2, dqthr;
+ short ylfrac, thr1;
+ short pk0;
+
+ pk0 = (dqsez < 0) ? 1 : 0; /* needed in updating predictor poles */
+
+ mag = dq & 0x7FFF; /* prediction difference magnitude */
+ /* TRANS */
+ ylint = short (state_ptr->yl >> 15); /* exponent part of yl */
+ ylfrac = (state_ptr->yl >> 10) & 0x1F; /* fractional part of yl */
+ thr1 = (32 + ylfrac) << ylint; /* threshold */
+ thr2 = (ylint > 9) ? 31 << 10 : thr1; /* limit thr2 to 31 << 10 */
+ dqthr = (thr2 + (thr2 >> 1)) >> 1; /* dqthr = 0.75 * thr2 */
+ if (state_ptr->td == 0) /* signal supposed voice */
+ tr = 0;
+ else if (mag <= dqthr) /* supposed data, but small mag */
+ tr = 0; /* treated as voice */
+ else /* signal is data (modem) */
+ tr = 1;
+
+ /*
+ * Quantizer scale factor adaptation.
+ */
+
+ /* FUNCTW & FILTD & DELAY */
+ /* update non-steady state step size multiplier */
+ state_ptr->yu = y + ((wi - y) >> 5);
+
+ /* LIMB */
+ if (state_ptr->yu < 544) /* 544 <= yu <= 5120 */
+ state_ptr->yu = 544;
+ else if (state_ptr->yu > 5120)
+ state_ptr->yu = 5120;
+
+ /* FILTE & DELAY */
+ /* update steady state step size multiplier */
+ state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);
+
+ /*
+ * Adaptive predictor coefficients.
+ */
+ if (tr == 1) { /* reset a's and b's for modem signal */
+ state_ptr->a[0] = 0;
+ state_ptr->a[1] = 0;
+ state_ptr->b[0] = 0;
+ state_ptr->b[1] = 0;
+ state_ptr->b[2] = 0;
+ state_ptr->b[3] = 0;
+ state_ptr->b[4] = 0;
+ state_ptr->b[5] = 0;
+
+ a2p = 0; /* eliminate Compiler Warnings */
+ } else { /* update a's and b's */
+ pks1 = pk0 ^ state_ptr->pk[0]; /* UPA2 */
+
+ /* update predictor pole a[1] */
+ a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
+ if (dqsez != 0) {
+ fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
+ if (fa1 < -8191) /* a2p = function of fa1 */
+ a2p -= 0x100;
+ else if (fa1 > 8191)
+ a2p += 0xFF;
+ else
+ a2p += fa1 >> 5;
+
+ if (pk0 ^ state_ptr->pk[1])
+ /* LIMC */
+ if (a2p <= -12160)
+ a2p = -12288;
+ else if (a2p >= 12416)
+ a2p = 12288;
+ else
+ a2p -= 0x80;
+ else if (a2p <= -12416)
+ a2p = -12288;
+ else if (a2p >= 12160)
+ a2p = 12288;
+ else
+ a2p += 0x80;
+ }
+
+ /* TRIGB & DELAY */
+ state_ptr->a[1] = a2p;
+
+ /* UPA1 */
+ /* update predictor pole a[0] */
+ state_ptr->a[0] -= state_ptr->a[0] >> 8;
+ if (dqsez != 0)
+ if (pks1 == 0)
+ state_ptr->a[0] += 192;
+ else
+ state_ptr->a[0] -= 192;
+
+ /* LIMD */
+ a1ul = 15360 - a2p;
+ if (state_ptr->a[0] < -a1ul)
+ state_ptr->a[0] = -a1ul;
+ else if (state_ptr->a[0] > a1ul)
+ state_ptr->a[0] = a1ul;
+
+ /* UPB : update predictor zeros b[6] */
+ for (cnt = 0; cnt < 6; cnt++) {
+ if (code_size == 5) /* for 40Kbps G.723 */
+ state_ptr->b[cnt] -= state_ptr->b[cnt] >> 9;
+ else /* for G.721 and 24Kbps G.723 */
+ state_ptr->b[cnt] -= state_ptr->b[cnt] >> 8;
+ if (dq & 0x7FFF) { /* XOR */
+ if ((dq ^ state_ptr->dq[cnt]) >= 0)
+ state_ptr->b[cnt] += 128;
+ else
+ state_ptr->b[cnt] -= 128;
+ }
+ }
+ }
+
+ for (cnt = 5; cnt > 0; cnt--)
+ state_ptr->dq[cnt] = state_ptr->dq[cnt-1];
+ /* FLOAT A : convert dq[0] to 4-bit exp, 6-bit mantissa f.p. */
+ if (mag == 0) {
+ state_ptr->dq[0] = (dq >= 0) ? 0x20 : 0xFC20;
+ } else {
+ state_ptr->dq[0] = (dq >= 0) ?
+ base2 (mag) : base2 (mag) - 0x400;
+ }
+
+ state_ptr->sr[1] = state_ptr->sr[0];
+ /* FLOAT B : convert sr to 4-bit exp., 6-bit mantissa f.p. */
+ if (sr == 0) {
+ state_ptr->sr[0] = 0x20;
+ } else if (sr > 0) {
+ state_ptr->sr[0] = base2(sr);
+ } else if (sr > -32768) {
+ mag = -sr;
+ state_ptr->sr[0] = base2(mag) - 0x400;
+ } else
+ state_ptr->sr[0] = short (0xFC20);
+
+ /* DELAY A */
+ state_ptr->pk[1] = state_ptr->pk[0];
+ state_ptr->pk[0] = pk0;
+
+ /* TONE */
+ if (tr == 1) /* this sample has been treated as data */
+ state_ptr->td = 0; /* next one will be treated as voice */
+ else if (a2p < -11776) /* small sample-to-sample correlation */
+ state_ptr->td = 1; /* signal may be data */
+ else /* signal is voice */
+ state_ptr->td = 0;
+
+ /*
+ * Adaptation speed control.
+ */
+ state_ptr->dms += (fi - state_ptr->dms) >> 5; /* FILTA */
+ state_ptr->dml += (((fi << 2) - state_ptr->dml) >> 7); /* FILTB */
+
+ if (tr == 1)
+ state_ptr->ap = 256;
+ else if (y < 1536) /* SUBTC */
+ state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+ else if (state_ptr->td == 1)
+ state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+ else if (abs((state_ptr->dms << 2) - state_ptr->dml) >=
+ (state_ptr->dml >> 3))
+ state_ptr->ap += (0x200 - state_ptr->ap) >> 4;
+ else
+ state_ptr->ap += (-state_ptr->ap) >> 4;
+}
+
+/*
+ * tandem_adjust(sr, se, y, i, sign)
+ *
+ * At the end of ADPCM decoding, it simulates an encoder which may be receiving
+ * the output of this decoder as a tandem process. If the output of the
+ * simulated encoder differs from the input to this decoder, the decoder output
+ * is adjusted by one level of A-law or u-law codes.
+ *
+ * Input:
+ * sr decoder output linear PCM sample,
+ * se predictor estimate sample,
+ * y quantizer step size,
+ * i decoder input code,
+ * sign sign bit of code i
+ *
+ * Return:
+ * adjusted A-law or u-law compressed sample.
+ */
+int
+tandem_adjust_alaw(
+ int sr, /* decoder output linear PCM sample */
+ int se, /* predictor estimate sample */
+ int y, /* quantizer step size */
+ int i, /* decoder input code */
+ int sign,
+ short *qtab)
+{
+ unsigned char sp; /* A-law compressed 8-bit code */
+ short dx; /* prediction error */
+ char id; /* quantized prediction error */
+ int sd; /* adjusted A-law decoded sample value */
+ int im; /* biased magnitude of i */
+ int imx; /* biased magnitude of id */
+
+ if (sr <= -32768)
+ sr = -1;
+ sp = linear2alaw((sr >> 1) << 3); /* short to A-law compression */
+ dx = (alaw2linear(sp) >> 2) - se; /* 16-bit prediction error */
+ id = quantize(dx, y, qtab, sign - 1);
+
+ if (id == i) { /* no adjustment on sp */
+ return (sp);
+ } else { /* sp adjustment needed */
+ /* ADPCM codes : 8, 9, ... F, 0, 1, ... , 6, 7 */
+ im = i ^ sign; /* 2's complement to biased unsigned */
+ imx = id ^ sign;
+
+ if (imx > im) { /* sp adjusted to next lower value */
+ if (sp & 0x80) {
+ sd = (sp == 0xD5) ? 0x55 :
+ ((sp ^ 0x55) - 1) ^ 0x55;
+ } else {
+ sd = (sp == 0x2A) ? 0x2A :
+ ((sp ^ 0x55) + 1) ^ 0x55;
+ }
+ } else { /* sp adjusted to next higher value */
+ if (sp & 0x80)
+ sd = (sp == 0xAA) ? 0xAA :
+ ((sp ^ 0x55) + 1) ^ 0x55;
+ else
+ sd = (sp == 0x55) ? 0xD5 :
+ ((sp ^ 0x55) - 1) ^ 0x55;
+ }
+ return (sd);
+ }
+}
+
+int
+tandem_adjust_ulaw(
+ int sr, /* decoder output linear PCM sample */
+ int se, /* predictor estimate sample */
+ int y, /* quantizer step size */
+ int i, /* decoder input code */
+ int sign,
+ short *qtab)
+{
+ unsigned char sp; /* u-law compressed 8-bit code */
+ short dx; /* prediction error */
+ char id; /* quantized prediction error */
+ int sd; /* adjusted u-law decoded sample value */
+ int im; /* biased magnitude of i */
+ int imx; /* biased magnitude of id */
+
+ if (sr <= -32768)
+ sr = 0;
+ sp = linear2ulaw(sr << 2); /* short to u-law compression */
+ dx = (ulaw2linear(sp) >> 2) - se; /* 16-bit prediction error */
+ id = quantize(dx, y, qtab, sign - 1);
+ if (id == i) {
+ return (sp);
+ } else {
+ /* ADPCM codes : 8, 9, ... F, 0, 1, ... , 6, 7 */
+ im = i ^ sign; /* 2's complement to biased unsigned */
+ imx = id ^ sign;
+ if (imx > im) { /* sp adjusted to next lower value */
+ if (sp & 0x80)
+ sd = (sp == 0xFF) ? 0x7E : sp + 1;
+ else
+ sd = (sp == 0) ? 0 : sp - 1;
+
+ } else { /* sp adjusted to next higher value */
+ if (sp & 0x80)
+ sd = (sp == 0x80) ? 0x80 : sp - 1;
+ else
+ sd = (sp == 0x7F) ? 0xFE : sp + 1;
+ }
+ return (sd);
+ }
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndaiff.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndaiff.cpp"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+#endif
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#include "wx/stream.h"
+#include "wx/datstrm.h"
+#include "wx/filefn.h"
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndcodec.h"
+#include "wx/mmedia/sndfile.h"
+#include "wx/mmedia/sndpcm.h"
+#include "wx/mmedia/sndaiff.h"
+
+#define BUILD_SIGNATURE(a,b,c,d) (((wxUint32)a) | (((wxUint32)b) << 8) | (((wxUint32)c) << 16) | (((wxUint32)d) << 24))
+
+#define FORM_SIGNATURE BUILD_SIGNATURE('F','O','R','M')
+#define AIFF_SIGNATURE BUILD_SIGNATURE('A','I','F','F')
+#define AIFC_SIGNATURE BUILD_SIGNATURE('A','I','F','C')
+#define COMM_SIGNATURE BUILD_SIGNATURE('C','O','M','M')
+#define SSND_SIGNATURE BUILD_SIGNATURE('S','S','N','D')
+
+wxSoundAiff::wxSoundAiff(wxInputStream& stream, wxSoundStream& io_sound)
+ : wxSoundFileStream(stream, io_sound)
+{
+ m_base_offset = wxInvalidOffset;
+}
+
+wxSoundAiff::wxSoundAiff(wxOutputStream& stream, wxSoundStream& io_sound)
+ : wxSoundFileStream(stream, io_sound)
+{
+ m_base_offset = wxInvalidOffset;
+}
+
+wxSoundAiff::~wxSoundAiff()
+{
+}
+
+wxString wxSoundAiff::GetCodecName() const
+{
+ return "wxSoundAiff codec";
+}
+
+bool wxSoundAiff::CanRead()
+{
+ wxUint32 signature1, signature2, len;
+
+ if (m_input->Read(&signature1, 4).LastRead() != 4)
+ return FALSE;
+
+ if (wxUINT32_SWAP_ON_BE(signature1) != FORM_SIGNATURE) {
+ m_input->Ungetch(&signature1, 4);
+ return FALSE;
+ }
+
+ m_input->Read(&len, 4);
+ if (m_input->LastRead() != 4) {
+ m_input->Ungetch(&len, m_input->LastRead());
+ m_input->Ungetch(&signature1, 4);
+ return FALSE;
+ }
+
+ if (m_input->Read(&signature2, 4).LastRead() != 4) {
+ m_input->Ungetch(&signature2, m_input->LastRead());
+ m_input->Ungetch(&len, 4);
+ m_input->Ungetch(&signature1, 4);
+ return FALSE;
+ }
+
+ m_input->Ungetch(&signature2, 4);
+ m_input->Ungetch(&len, 4);
+ m_input->Ungetch(&signature1, 4);
+
+ if (
+ wxUINT32_SWAP_ON_BE(signature2) != AIFF_SIGNATURE &&
+ wxUINT32_SWAP_ON_BE(signature2) != AIFC_SIGNATURE)
+ return FALSE;
+
+ return TRUE;
+}
+
+#define FAIL_WITH(condition, err) if (condition) { m_snderror = err; return FALSE; }
+
+bool wxSoundAiff::PrepareToPlay()
+{
+ wxDataInputStream data(*m_input);
+ wxUint32 signature, len, ssnd;
+ bool end_headers;
+
+ if (!m_input) {
+ m_snderror = wxSOUND_INVSTRM;
+ return FALSE;
+ }
+ m_snderror = wxSOUND_NOERROR;
+
+ data.BigEndianOrdered(TRUE);
+
+ FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
+ FAIL_WITH(wxUINT32_SWAP_ON_BE(signature) != FORM_SIGNATURE, wxSOUND_INVSTRM);
+ // "FORM"
+
+ len = data.Read32();
+ FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);
+ // dummy len
+
+ FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
+ FAIL_WITH(
+ wxUINT32_SWAP_ON_BE(signature) != AIFF_SIGNATURE &&
+ wxUINT32_SWAP_ON_BE(signature) != AIFC_SIGNATURE, wxSOUND_INVSTRM);
+ // "AIFF" / "AIFC"
+
+ end_headers = FALSE;
+ while (!end_headers) {
+ FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
+
+ len = data.Read32();
+ FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);
+
+ switch (wxUINT32_SWAP_ON_BE(signature)) {
+ case COMM_SIGNATURE: { // "COMM"
+ wxUint16 channels, bps;
+ wxUint32 num_samples;
+ double srate;
+ wxSoundFormatPcm sndformat;
+
+ // Get sound data informations
+ data >> channels >> num_samples >> bps >> srate;
+
+ // Convert them in a wxSoundFormat object
+ sndformat.SetSampleRate((wxUint32) srate);
+ sndformat.SetBPS(bps);
+ sndformat.SetChannels(channels);
+ sndformat.Signed(FALSE);
+ sndformat.SetOrder(wxBIG_ENDIAN);
+
+ if (!SetSoundFormat(sndformat))
+ return FALSE;
+ // We pass all data left
+ m_input->SeekI(len-18, wxFromCurrent);
+ break;
+ }
+ case SSND_SIGNATURE: { // "SSND"
+ data >> ssnd;
+ // m_input->SeekI(4, wxFromCurrent); // Pass an INT32
+ // m_input->SeekI(len-4, wxFromCurrent); // Pass the rest
+ m_input->SeekI(ssnd + 4, wxFromCurrent);
+ m_base_offset = m_input->TellI();
+ // len-8 bytes of samples
+ FinishPreparation(len - 8);
+ end_headers = TRUE;
+ break;
+ }
+ default:
+ m_input->SeekI(len, wxFromCurrent);
+ break;
+ }
+ }
+ return TRUE;
+}
+
+bool wxSoundAiff::PrepareToRecord(wxUint32 time)
+{
+ // TODO
+ return FALSE;
+}
+
+bool wxSoundAiff::FinishRecording()
+{
+ // TODO
+ return FALSE;
+}
+
+bool wxSoundAiff::RepositionStream(wxUint32 position)
+{
+ // If the stream is not seekable "TellI() returns wxInvalidOffset" we cannot reposition stream
+ if (m_base_offset == wxInvalidOffset)
+ return FALSE;
+ m_input->SeekI(m_base_offset, wxFromStart);
+ return TRUE;
+}
+
+wxUint32 wxSoundAiff::GetData(void *buffer, wxUint32 len)
+{
+ return m_input->Read(buffer, len).LastRead();
+}
+
+wxUint32 wxSoundAiff::PutData(const void *buffer, wxUint32 len)
+{
+ return m_output->Write(buffer, len).LastWrite();
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndbase.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999, 2000
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndbase.cpp"
+#endif
+
+#include <wx/wxprec.h>
+#include "wx/mmedia/sndbase.h"
+
+
+// ---------------------------------------------------------------------------
+// wxSoundFormatBase
+// ---------------------------------------------------------------------------
+
+wxSoundFormatBase::wxSoundFormatBase()
+{
+}
+
+wxSoundFormatBase::~wxSoundFormatBase()
+{
+}
+
+wxSoundFormatBase *wxSoundFormatBase::Clone() const
+{
+ return NULL;
+}
+
+bool wxSoundFormatBase::operator!=(const wxSoundFormatBase& frmt2) const
+{
+ return (GetType() != frmt2.GetType());
+}
+
+// ---------------------------------------------------------------------------
+// wxSoundStream
+// ---------------------------------------------------------------------------
+
+wxSoundStream::wxSoundStream()
+{
+ int i;
+
+ // Reset all variables to their neutral value.
+ m_sndformat = NULL;
+ m_handler = NULL;
+ m_snderror = wxSOUND_NOERROR;
+ m_lastcount = 0;
+ for (i=0;i<2;i++)
+ m_callback[i] = NULL;
+}
+
+wxSoundStream::~wxSoundStream()
+{
+ if (m_sndformat)
+ delete m_sndformat;
+}
+
+// --------------------------------------------------------------------------
+// SetSoundFormat(const wxSoundFormatBase& format) is one of the most
+// important function of the wxSoundStream class. It prepares the stream to
+// receive or send the data in a strict format. Normally, the sound stream
+// should be ready to accept any format it is asked to manage but in certain
+// cases, it really cannot: in that case it returns FALSE. To have more
+// details in the functionnalities of SetSoundFormat see
+// wxSoundRouterStream::SetSoundFormat()
+// --------------------------------------------------------------------------
+bool wxSoundStream::SetSoundFormat(const wxSoundFormatBase& format)
+{
+ // delete the previous prepared format
+ if (m_sndformat)
+ delete m_sndformat;
+
+ // create a new one by cloning the format passed in parameter
+ m_sndformat = format.Clone();
+ return TRUE;
+}
+
+
+// --------------------------------------------------------------------------
+// Register(int evt, ...) registers the callback for a specified async event.
+// Warning ! Only one callback by event is supported. It means that if you
+// call twice this function the previous registered callback is absolutely
+// ignored.
+// --------------------------------------------------------------------------
+void wxSoundStream::SetCallback(int evt, wxSoundCallback cbk, void *cdata)
+{
+ int c;
+
+ switch (evt) {
+ case wxSOUND_INPUT:
+ c = 0;
+ break;
+ case wxSOUND_OUTPUT:
+ c = 1;
+ break;
+ default:
+ return;
+ }
+ m_callback[c] = cbk;
+ m_cdata[c] = cdata;
+}
+
+// --------------------------------------------------------------------------
+// OnSoundEvent(int evt) is called either when the driver is ready to receive
+// a new block to play or when the driver has a new recorded buffer. You
+// must be careful here and try not to spend a lot of time: this is a
+// real-time call. In the case, an "event handler" was specified previously,
+// it called him before everything.
+// --------------------------------------------------------------------------
+void wxSoundStream::OnSoundEvent(int evt)
+{
+ int c;
+
+ if (m_handler) {
+ m_handler->OnSoundEvent(evt);
+ return;
+ }
+
+ switch (evt) {
+ case wxSOUND_INPUT:
+ c = 0;
+ break;
+ case wxSOUND_OUTPUT:
+ c = 1;
+ break;
+ default:
+ return;
+ }
+ if (m_callback[c])
+ m_callback[c](this, evt, m_cdata[c]);
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndcodec.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndcodec.cpp"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+#include "wx/defs.h"
+#endif
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndcodec.h"
+
+wxSoundStreamCodec::wxSoundStreamCodec(wxSoundStream& snd_io)
+ : m_sndio(&snd_io)
+{
+}
+
+wxSoundStreamCodec::~wxSoundStreamCodec()
+{
+}
+
+bool wxSoundStreamCodec::StartProduction(int evt)
+{
+ return m_sndio->StartProduction(evt);
+}
+
+bool wxSoundStreamCodec::StopProduction()
+{
+ return m_sndio->StopProduction();
+}
+
+wxUint32 wxSoundStreamCodec::GetBestSize() const
+{
+ return m_sndio->GetBestSize();
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndcpcm.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999, 2000
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndcpcm.cpp"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+ #include "wx/debug.h"
+ #include "wx/log.h"
+#endif
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndpcm.h"
+#include "wx/mmedia/sndcpcm.h"
+
+wxSoundStreamPcm::wxSoundStreamPcm(wxSoundStream& sndio)
+ : wxSoundStreamCodec(sndio)
+{
+ m_function_in = NULL;
+ m_function_out = NULL;
+ m_prebuffer = NULL;
+ m_prebuffer_size = 0;
+ m_best_size = 0;
+}
+
+wxSoundStreamPcm::~wxSoundStreamPcm()
+{
+ if (m_prebuffer)
+ delete[] m_prebuffer;
+}
+
+wxUint32 wxSoundStreamPcm::GetBestSize() const
+{
+ return m_best_size;
+}
+
+// -----------------------------------------------------------------------
+// "Converters" definitions/implementations
+// -----------------------------------------------------------------------
+
+#define DEFINE_CONV(name, input_type, output_type, convert) \
+static void Convert_##name##(const void *buf_in, void *buf_out, wxUint32 len) \
+{\
+ register input_type src; \
+ register const input_type *t_buf_in = (input_type *)buf_in; \
+ register output_type *t_buf_out = (output_type *)buf_out; \
+\
+ while (len > 0) { \
+ src = *t_buf_in++; \
+ *t_buf_out++ = convert; \
+ len -= sizeof(input_type); \
+ } \
+}
+
+// TODO: define converters for all other formats (32, 24)
+
+DEFINE_CONV(8_8_sign, wxUint8, wxUint8, (src ^ 0x80))
+
+DEFINE_CONV(8_16, wxUint8, wxUint16, (((wxUint16)src) << 8))
+DEFINE_CONV(8_16_swap, wxUint8, wxUint16, (src))
+DEFINE_CONV(8_16_sign, wxUint8, wxUint16, (((wxUint16)(src ^ 0x80)) << 8))
+DEFINE_CONV(8_16_sign_swap, wxUint8, wxUint16, (src ^ 0x80))
+
+DEFINE_CONV(16_8, wxUint16, wxUint8, (wxUint8)(src >> 8))
+DEFINE_CONV(16_8_sign, wxUint16, wxUint8, (wxUint8)((src >> 8) ^ 0x80))
+DEFINE_CONV(16_swap_8, wxUint16, wxUint8, (wxUint8)(src & 0xff))
+DEFINE_CONV(16_swap_8_sign, wxUint16, wxUint8, (wxUint8)((src & 0xff) ^ 0x80))
+
+//DEFINE_CONV(24_8, wxUint32, wxUint8, (wxUint8)(src >> 16))
+//DEFINE_CONV(24_8_sig, wxUint32, wxUint8, (wxUint8)((src >> 16) ^ 0x80))
+
+//DEFINE_CONV(32_8, wxUint32, wxUint8, (wxUint8)(src >> 24))
+
+DEFINE_CONV(16_sign, wxUint16, wxUint16, (src ^ 0x8000))
+DEFINE_CONV(16_swap, wxUint16, wxUint16, (((src & 0xff) << 8) | ((src >> 8) & 0xff)))
+// Problem.
+DEFINE_CONV(16_swap_16_sign, wxUint16, wxUint16, ((((src & 0xff) << 8) | ((src >> 8) & 0xff)) ^ 0x80))
+// DEFINE_CONV(16_sign_16_swap, wxUint16, wxUint16, ((((src & 0xff) << 8) | ((src >> 8) & 0xff)) ^ 0x8000))
+DEFINE_CONV(16_swap_16_sign_swap, wxUint16, wxUint16, (src ^ 0x80))
+
+// -----------------------------------------------------------------------
+// Main PCM stream converter table
+// -----------------------------------------------------------------------
+// Definition
+// XX -> YY
+// XX -> YY sign
+//
+// XX swapped -> YY
+// XX swapped -> YY sign
+//
+// XX swapped -> YY swapped
+// XX swapped -> YY swapped sign
+//
+// XX stereo -> YY mono
+// XX stereo -> YY mono sign
+//
+// XX swapped stereo -> YY swapped mono
+// XX swapped stereo -> YY swapped mono sign
+//
+// XX swapped stereo -> YY swapped mono
+// XX swapped stereo -> YY swapped mono sign
+
+static wxSoundStreamPcm::ConverterType s_converters[4][3][2] = {
+ {
+ {
+ NULL,
+ Convert_8_8_sign /* 8 -> 8 sign */
+ },
+ {
+ NULL,
+ NULL
+ },
+ {
+ NULL,
+ NULL
+ }
+ },
+ {
+ {
+ Convert_8_16, /* 8 -> 16 */
+ Convert_8_16_sign /* 8 -> 16 sign */
+ },
+ {
+ Convert_8_16_swap, /* 8 -> 16 swapped */
+ Convert_8_16_sign_swap /* 8 -> 16 sign swapped */
+ },
+ {
+ NULL,
+ NULL
+ }
+ },
+ {
+ {
+ Convert_16_8, /* 16 -> 8 */
+ Convert_16_8_sign /* 16 -> 8 sign */
+ },
+ {
+ Convert_16_swap_8, /* 16 swapped -> 8 */
+ Convert_16_swap_8_sign /* 16 swapped -> 8 sign */
+ },
+ {
+ NULL,
+ NULL
+ },
+ },
+
+ {
+ {
+ NULL, /* 16 -> 16 */
+ Convert_16_sign /* 16 -> 16 sign */
+ },
+ {
+ Convert_16_swap, /* 16 swapped -> 16 */
+ Convert_16_swap_16_sign /* 16 swapped -> 16 sign */
+ },
+ {
+ NULL,
+ Convert_16_swap_16_sign_swap /* 16 swapped -> 16 sign swapped */
+ }
+ }
+};
+
+// This is the buffer size multiplier. It gives the needed size of the output size.
+static float s_converters_multip[] = {1, 2, 0.5, 1};
+
+//
+// TODO: Read() and Write() aren't really safe. If you give it a buffer which
+// is not aligned on 2, you may crash (See converter.def).
+//
+
+wxSoundStream& wxSoundStreamPcm::Read(void *buffer, wxUint32 len)
+{
+ wxUint32 in_bufsize;
+
+ // We must have a multiple of 2
+ len &= 0x01;
+
+ if (!m_function_in) {
+ m_sndio->Read(buffer, len);
+ m_lastcount = m_sndio->GetLastAccess();
+ m_snderror = m_sndio->GetError();
+ return *this;
+ }
+
+ in_bufsize = GetReadSize(len);
+
+ if (len <= m_best_size) {
+ m_sndio->Read(m_prebuffer, in_bufsize);
+ m_snderror = m_sndio->GetError();
+ if (m_snderror != wxSOUND_NOERROR) {
+ m_lastcount = 0;
+ return *this;
+ }
+
+ m_function_in(m_prebuffer, buffer, m_sndio->GetLastAccess());
+ } else {
+ char *temp_buffer;
+
+ temp_buffer = new char[in_bufsize];
+ m_sndio->Read(temp_buffer, in_bufsize);
+
+ m_snderror = m_sndio->GetError();
+ if (m_snderror != wxSOUND_NOERROR) {
+ m_lastcount = 0;
+ return *this;
+ }
+
+ m_function_in(temp_buffer, buffer, m_sndio->GetLastAccess());
+
+ delete[] temp_buffer;
+ }
+
+ m_lastcount = (wxUint32)(m_sndio->GetLastAccess() * m_multiplier_in);
+
+ return *this;
+}
+
+wxSoundStream& wxSoundStreamPcm::Write(const void *buffer, wxUint32 len)
+{
+ wxUint32 out_bufsize;
+
+ if (!m_function_out) {
+ m_sndio->Write(buffer, len);
+ m_lastcount = m_sndio->GetLastAccess();
+ m_snderror = m_sndio->GetError();
+ return *this;
+ }
+
+ out_bufsize = GetWriteSize(len);
+
+ if (len <= m_best_size) {
+ out_bufsize = GetWriteSize(len);
+
+ m_function_out(buffer, m_prebuffer, len);
+ m_sndio->Write(m_prebuffer, out_bufsize);
+ m_snderror = m_sndio->GetError();
+ if (m_snderror != wxSOUND_NOERROR) {
+ m_lastcount = 0;
+ return *this;
+ }
+ } else {
+ char *temp_buffer;
+
+ temp_buffer = new char[out_bufsize];
+ m_function_out(buffer, temp_buffer, len);
+
+ m_sndio->Write(temp_buffer, out_bufsize);
+ m_snderror = m_sndio->GetError();
+ if (m_snderror != wxSOUND_NOERROR) {
+ m_lastcount = 0;
+ return *this;
+ }
+
+ delete[] temp_buffer;
+ }
+
+ m_lastcount = (wxUint32)(m_sndio->GetLastAccess() / m_multiplier_out);
+
+ return *this;
+}
+
+bool wxSoundStreamPcm::SetSoundFormat(const wxSoundFormatBase& format)
+{
+ wxSoundFormatBase *new_format;
+ wxSoundFormatPcm *pcm_format, *pcm_format2;
+
+ if (m_sndio->SetSoundFormat(format)) {
+ m_function_out = NULL;
+ m_function_in = NULL;
+ return TRUE;
+ }
+ if (format.GetType() != wxSOUND_PCM) {
+ m_snderror = wxSOUND_INVFRMT;
+ return FALSE;
+ }
+ if (m_sndformat)
+ delete m_sndformat;
+
+ new_format = m_sndio->GetSoundFormat().Clone();
+ pcm_format = (wxSoundFormatPcm *)&format;
+ pcm_format2 = (wxSoundFormatPcm *)new_format;
+
+#if 0
+ // ----------------------------------------------------
+ // Test whether we need to resample
+ if (pcm_format->GetSampleRate() != pcm_format2->GetSampleRate()) {
+ wxUint32 src_rate, dst_rate;
+
+ src_rate = pcm_format->GetSampleRate();
+ dst_rate = pcm_format2->GetSampleRate();
+ m_needResampling = TRUE;
+ if (src_rate < dst_rate)
+ m_expandSamples = TRUE;
+ else
+ m_expandSamples = FALSE;
+ m_pitch = (src_rate << FLOATBITS) / dst_rate;
+ }
+#endif
+ // ----------------------------------------------------
+ // Select table to use:
+ // * 8 bits -> 8 bits
+ // * 16 bits -> 8 bits
+ // * 8 bits -> 16 bits
+ // * 16 bits -> 16 bits
+
+ int table_no, table_no2;
+ int i_sign, i_swap;
+
+ switch (pcm_format->GetBPS()) {
+ case 8:
+ table_no = 0;
+ break;
+ case 16:
+ table_no = 1;
+ break;
+ default:
+ // TODO: Add something here: error, log, ...
+ return FALSE;
+ }
+ switch (pcm_format2->GetBPS()) {
+ case 8:
+ table_no2 = 0;
+ break;
+ case 16:
+ table_no2 = 1;
+ break;
+ default:
+ // TODO: Add something here: error, log, ...
+ return FALSE;
+ }
+
+ if (pcm_format2->Signed() != pcm_format->Signed())
+ i_sign = 1;
+ else
+ i_sign = 0;
+
+#define MY_ORDER wxBYTE_ORDER
+#if wxBYTE_ORDER == wxLITTLE_ENDIAN
+#define OTHER_ORDER wxBIG_ENDIAN
+#else
+#define OTHER_ORDER wxLITTLE_ENDIAN
+#endif
+
+ // --------------------------------------------------------
+ // Find the good converter !
+
+ if (pcm_format->GetOrder() == OTHER_ORDER) {
+ if (pcm_format->GetOrder() == pcm_format2->GetOrder())
+ i_swap = 2;
+ else
+ i_swap = 1;
+ } else {
+ if (pcm_format->GetOrder() == pcm_format2->GetOrder())
+ i_swap = 0;
+ else
+ i_swap = 1;
+ }
+
+ m_function_out = s_converters[table_no*2+table_no2][i_swap][i_sign];
+ m_function_in = s_converters[table_no2*2+table_no][i_swap][i_sign];
+ m_multiplier_out = s_converters_multip[table_no*2+table_no2];
+ m_multiplier_in = s_converters_multip[table_no2*2+table_no2];
+
+ if (m_prebuffer)
+ delete[] m_prebuffer;
+
+ // We try to minimize the need of dynamic memory allocation by preallocating a buffer. But
+ // to be sure it will be efficient we minimize the best size.
+ if (m_multiplier_in < m_multiplier_out) {
+ m_prebuffer_size = (wxUint32)(m_sndio->GetBestSize() * m_multiplier_out);
+ m_best_size = (wxUint32)(m_sndio->GetBestSize() * m_multiplier_in);
+ } else {
+ m_prebuffer_size = (wxUint32)(m_sndio->GetBestSize() * m_multiplier_in);
+ m_best_size = (wxUint32)(m_sndio->GetBestSize() * m_multiplier_out);
+ }
+
+ m_prebuffer = new char[m_prebuffer_size];
+
+ bool SetSoundFormatReturn;
+
+ SetSoundFormatReturn = m_sndio->SetSoundFormat(*new_format);
+ wxASSERT( SetSoundFormatReturn );
+
+ m_sndformat = new_format;
+ return TRUE;
+}
+
+wxUint32 wxSoundStreamPcm::GetWriteSize(wxUint32 len) const
+{
+ // For the moment, it is simple but next time it will become more complicated
+ // (Resampling)
+ return (wxUint32)(len * m_multiplier_out);
+}
+
+wxUint32 wxSoundStreamPcm::GetReadSize(wxUint32 len) const
+{
+ return (wxUint32)(len / m_multiplier_in);
+}
+
+// Resampling engine. NOT FINISHED and NOT INCLUDED but this is a first DRAFT.
+
+#if 0
+
+#define FLOATBITS 16
+#define INTBITS 16
+#define FLOATMASK 0xffff
+#define INTMASK 0xffff0000
+
+void ResamplingShrink_##DEPTH##(const void *source, void *destination, wxUint32 len)
+{
+ wxUint##DEPTH## *source_data, *dest_data;
+ wxUint32 pos;
+
+ source_data = (wxUint##DEPTH## *)source;
+ dest_data = (wxUint##DEPTH## *)destination;
+
+ pos = m_saved_pos;
+ while (len > 0) {
+ // Increment the position in the input buffer
+ pos += m_pitch;
+ if (pos & INTMASK) {
+ pos &= FLOATMASK;
+
+ *dest_data ++ = *source_data;
+ }
+ len--;
+ source_data++;
+ }
+ m_saved_pos = pos;
+}
+#endif
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndesd.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndesd.cpp"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+ #include "wx/string.h"
+#endif
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+// --------------------------------------------------------------------------
+// MMedia headers
+// --------------------------------------------------------------------------
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndesd.h"
+#include "wx/mmedia/sndpcm.h"
+
+// --------------------------------------------------------------------------
+// System headers
+// --------------------------------------------------------------------------
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <esd.h>
+#ifdef __WXGTK__
+#include <gdk/gdk.h>
+#endif
+
+// --------------------------------------------------------------------------
+
+#define MY_ESD_NAME "wxWindows/wxSoundStreamESD"
+
+// --------------------------------------------------------------------------
+// wxSoundStreamESD: ESD sound driver
+
+// --------------------------------------------------------------------------
+// Constructors/Destructors
+// --------------------------------------------------------------------------
+
+wxSoundStreamESD::wxSoundStreamESD(const wxString& hostname)
+{
+ wxSoundFormatPcm pcm_default;
+
+ // First, we make some basic test: is there ESD on this computer ?
+ m_esd_ok = FALSE;
+
+ if (hostname.IsNull())
+ m_fd_output = esd_play_stream(ESD_PLAY | ESD_STREAM, 22050,
+ hostname.mb_str(), MY_ESD_NAME);
+ else
+ m_fd_output = esd_play_stream(ESD_PLAY | ESD_STREAM, 22050,
+ NULL, MY_ESD_NAME);
+ if (m_fd_output == -1) {
+ // Answer: no. We return with an error.
+ m_snderror = wxSOUND_INVDEV;
+ return;
+ }
+
+ // Close this unuseful stream.
+ esd_close(m_fd_output);
+
+ m_hostname = hostname;
+
+ // Set the default audio format
+ SetSoundFormat(pcm_default);
+
+ // Initialize some variable
+ m_snderror = wxSOUND_NOERROR;
+ m_esd_stop = TRUE;
+ m_q_filled = TRUE;
+ m_esd_ok = TRUE;
+ m_fd_output= -1;
+ m_fd_input = -1;
+}
+
+wxSoundStreamESD::~wxSoundStreamESD()
+{
+ if (!m_esd_stop)
+ StopProduction();
+}
+
+// --------------------------------------------------------------------------
+// Read several samples
+// --------------------------------------------------------------------------
+
+wxSoundStream& wxSoundStreamESD::Read(void *buffer, wxUint32 len)
+{
+ int ret;
+
+ if (m_esd_stop) {
+ m_snderror = wxSOUND_NOTSTARTED;
+ return *this;
+ }
+
+ m_lastcount = (wxUint32)ret = read(m_fd_input, buffer, len);
+
+ if (ret < 0)
+ m_snderror = wxSOUND_IOERROR;
+ else
+ m_snderror = wxSOUND_NOERROR;
+
+ return *this;
+}
+
+// --------------------------------------------------------------------------
+// Write several samples
+// --------------------------------------------------------------------------
+wxSoundStream& wxSoundStreamESD::Write(const void *buffer, wxUint32 len)
+{
+ int ret;
+
+ if (m_esd_stop) {
+ m_lastcount = 0;
+ m_snderror = wxSOUND_NOTSTARTED;
+ return *this;
+ }
+
+ m_lastcount = (wxUint32)ret = write(m_fd_output, buffer, len);
+
+ if (ret < 0)
+ m_snderror = wxSOUND_IOERROR;
+ else
+ m_snderror = wxSOUND_NOERROR;
+
+ m_q_filled = TRUE;
+
+ return *this;
+}
+
+// --------------------------------------------------------------------------
+// SetSoundFormat(): this function specifies which format we want and which
+// format is available
+// --------------------------------------------------------------------------
+bool wxSoundStreamESD::SetSoundFormat(const wxSoundFormatBase& format)
+{
+ wxSoundFormatPcm *pcm_format;
+
+ if (format.GetType() != wxSOUND_PCM) {
+ m_snderror = wxSOUND_INVFRMT;
+ return FALSE;
+ }
+
+ if (!m_esd_ok) {
+ m_snderror = wxSOUND_INVDEV;
+ return FALSE;
+ }
+
+ if (m_sndformat)
+ delete m_sndformat;
+
+ m_sndformat = format.Clone();
+ if (!m_sndformat) {
+ m_snderror = wxSOUND_MEMERROR;
+ return FALSE;
+ }
+ pcm_format = (wxSoundFormatPcm *)m_sndformat;
+
+ // Detect the best format
+ DetectBest(pcm_format);
+
+ m_snderror = wxSOUND_NOERROR;
+ if (*pcm_format != format) {
+ m_snderror = wxSOUND_NOEXACT;
+ return FALSE;
+ }
+ return TRUE;
+}
+
+// --------------------------------------------------------------------------
+// _wxSound_OSS_CBack (internal): it is called when the driver (ESD) is
+// ready for a next buffer.
+// --------------------------------------------------------------------------
+#ifdef __WXGTK__
+static void _wxSound_OSS_CBack(gpointer data, int source,
+ GdkInputCondition condition)
+{
+ wxSoundStreamESD *esd = (wxSoundStreamESD *)data;
+
+ switch (condition) {
+ case GDK_INPUT_READ:
+ esd->WakeUpEvt(wxSOUND_INPUT);
+ break;
+ case GDK_INPUT_WRITE:
+ esd->WakeUpEvt(wxSOUND_OUTPUT);
+ break;
+ default:
+ break;
+ }
+}
+#endif
+
+
+// --------------------------------------------------------------------------
+// WakeUpEvt() (internal): it is called by _wxSound_OSS_CBack to bypass the
+// C++ protection
+// --------------------------------------------------------------------------
+void wxSoundStreamESD::WakeUpEvt(int evt)
+{
+ m_q_filled = FALSE;
+ OnSoundEvent(evt);
+}
+
+// --------------------------------------------------------------------------
+// StartProduction(): see wxSoundStream
+// --------------------------------------------------------------------------
+bool wxSoundStreamESD::StartProduction(int evt)
+{
+ wxSoundFormatPcm *pcm;
+ int flag = 0;
+
+ if (!m_esd_ok) {
+ m_snderror = wxSOUND_INVDEV;
+ return FALSE;
+ }
+
+ if (!m_esd_stop)
+ StopProduction();
+
+ pcm = (wxSoundFormatPcm *)m_sndformat;
+
+ flag |= (pcm->GetBPS() == 16) ? ESD_BITS16 : ESD_BITS8;
+ flag |= (pcm->GetChannels() == 2) ? ESD_STEREO : ESD_MONO;
+
+ if ((evt & wxSOUND_OUTPUT) != 0) {
+ flag |= ESD_PLAY | ESD_STREAM;
+ m_fd_output = esd_play_stream(flag, pcm->GetSampleRate(), NULL,
+ MY_ESD_NAME);
+ }
+
+ if ((evt & wxSOUND_INPUT) != 0) {
+ flag |= ESD_RECORD | ESD_STREAM;
+ m_fd_input = esd_record_stream(flag, pcm->GetSampleRate(), NULL,
+ MY_ESD_NAME);
+ }
+
+#ifdef __WXGTK__
+ if ((evt & wxSOUND_OUTPUT) != 0) {
+ m_tag_output = gdk_input_add(m_fd_output, GDK_INPUT_WRITE,
+ _wxSound_OSS_CBack, (gpointer)this);
+ }
+ if ((evt & wxSOUND_INPUT) != 0) {
+ m_tag_input = gdk_input_add(m_fd_input, GDK_INPUT_READ,
+ _wxSound_OSS_CBack, (gpointer)this);
+ }
+#endif
+
+ m_esd_stop = FALSE;
+ m_q_filled = FALSE;
+
+ return TRUE;
+}
+
+// --------------------------------------------------------------------------
+// StopProduction(): see wxSoundStream
+// --------------------------------------------------------------------------
+bool wxSoundStreamESD::StopProduction()
+{
+ if (m_esd_stop)
+ return FALSE;
+
+ if (m_fd_input != -1) {
+ esd_close(m_fd_input);
+#ifdef __WXGTK__
+ gdk_input_remove(m_tag_input);
+#endif
+ }
+ if (m_fd_output != -1) {
+ esd_close(m_fd_output);
+#ifdef __WXGTK__
+ gdk_input_remove(m_tag_output);
+#endif
+ }
+
+ m_fd_input = -1;
+ m_fd_output= -1;
+ m_esd_stop = TRUE;
+ m_q_filled = TRUE;
+ return TRUE;
+}
+
+//
+// Detect the closest format (The best).
+//
+void wxSoundStreamESD::DetectBest(wxSoundFormatPcm *pcm)
+{
+ wxSoundFormatPcm best_pcm;
+
+ // We change neither the number of channels nor the sample rate
+ // because ESD is clever.
+
+ best_pcm.SetSampleRate(pcm->GetSampleRate());
+ best_pcm.SetChannels(pcm->GetChannels());
+
+ // It supports 16 bits
+ if (pcm->GetBPS() >= 16)
+ best_pcm.SetBPS(16);
+ else
+ best_pcm.SetBPS(8);
+
+ best_pcm.SetOrder(wxLITTLE_ENDIAN);
+ best_pcm.Signed(TRUE);
+
+ // Finally recopy the new format
+ *pcm = best_pcm;
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndfile.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999, 2000
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#include <wx/wxprec.h>
+
+#ifndef WX_PRECOMP
+#include <wx/defs.h>
+#include <wx/stream.h>
+#endif
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndcodec.h"
+#include "wx/mmedia/sndfile.h"
+#include "wx/mmedia/sndcpcm.h"
+#include "wx/mmedia/sndulaw.h"
+#include "wx/mmedia/sndg72x.h"
+
+// --------------------------------------------------------------------------
+// Sound codec router
+// A very important class: it ensures that everybody is satisfied.
+// It is supposed to create as many codec as it is necessary to transform
+// a signal in a specific format in an another.
+// --------------------------------------------------------------------------
+wxSoundRouterStream::wxSoundRouterStream(wxSoundStream& sndio)
+ : wxSoundStreamCodec(sndio)
+{
+ m_router = NULL;
+}
+
+wxSoundRouterStream::~wxSoundRouterStream()
+{
+ if (m_router)
+ delete m_router;
+}
+
+// --------------------------------------------------------------------------
+// Read(void *buffer, wxUint32 len): It reads data synchronously. See sndbase.h
+// for possible errors and behaviours ...
+// --------------------------------------------------------------------------
+wxSoundStream& wxSoundRouterStream::Read(void *buffer, wxUint32 len)
+{
+ if (m_router) {
+ m_router->Read(buffer, len);
+ m_snderror = m_router->GetError();
+ m_lastcount = m_router->GetLastAccess();
+ } else {
+ m_sndio->Read(buffer, len);
+ m_snderror = m_sndio->GetError();
+ m_lastcount = m_sndio->GetLastAccess();
+ }
+ return *this;
+}
+
+// --------------------------------------------------------------------------
+// Write(const void *buffer, wxUint32 len): It writes data synchronously
+// --------------------------------------------------------------------------
+wxSoundStream& wxSoundRouterStream::Write(const void *buffer, wxUint32 len)
+{
+ if (m_router) {
+ m_router->Write(buffer, len);
+ m_snderror = m_router->GetError();
+ m_lastcount = m_router->GetLastAccess();
+ } else {
+ m_sndio->Write(buffer, len);
+ m_snderror = m_sndio->GetError();
+ m_lastcount = m_sndio->GetLastAccess();
+ }
+ return *this;
+}
+
+// --------------------------------------------------------------------------
+// SetSoundFormat(const wxSoundFormatBase& format) first tries to setup the
+// sound driver using the specified format. If this fails, it uses personnal
+// codec converters: for the moment there is a PCM converter (PCM to PCM:
+// with optional resampling, ...), an ULAW converter (ULAW to PCM), a G72X
+// converter (G72X to PCM). If nothing works, it returns FALSE.
+// --------------------------------------------------------------------------
+bool wxSoundRouterStream::SetSoundFormat(const wxSoundFormatBase& format)
+{
+ if (m_router)
+ delete m_router;
+
+ // First, we try to setup the sound device
+ if (m_sndio->SetSoundFormat(format)) {
+ // We are lucky, it is working.
+ wxSoundStream::SetSoundFormat(m_sndio->GetSoundFormat());
+ return TRUE;
+ }
+
+ switch(format.GetType()) {
+ case wxSOUND_NOFORMAT:
+ return FALSE;
+ case wxSOUND_PCM:
+ m_router = new wxSoundStreamPcm(*m_sndio);
+ m_router->SetSoundFormat(format);
+ break;
+ case wxSOUND_ULAW:
+ m_router = new wxSoundStreamUlaw(*m_sndio);
+ m_router->SetSoundFormat(format);
+ break;
+ case wxSOUND_G72X:
+ m_router = new wxSoundStreamG72X(*m_sndio);
+ m_router->SetSoundFormat(format);
+ break;
+ default:
+ return FALSE;
+
+ }
+ wxSoundStream::SetSoundFormat(m_router->GetSoundFormat());
+ return TRUE;
+}
+
+// --------------------------------------------------------------------------
+// GetBestSize() returns the specific best buffer size a sound driver
+// can manage. It means that it will be easier for it to manage the buffer
+// and so it will be faster and in some case more accurate for real-time event.
+// --------------------------------------------------------------------------
+wxUint32 wxSoundRouterStream::GetBestSize() const
+{
+ if (m_router)
+ return m_router->GetBestSize();
+ else
+ return m_sndio->GetBestSize();
+}
+
+// --------------------------------------------------------------------------
+// StartProduction(int evt). See sndbase.h
+// --------------------------------------------------------------------------
+bool wxSoundRouterStream::StartProduction(int evt)
+{
+ if (!m_router) {
+ if (m_sndio->StartProduction(evt))
+ return TRUE;
+
+ m_snderror = m_sndio->GetError();
+ m_lastcount = m_sndio->GetLastAccess();
+ return FALSE;
+ }
+
+ if (m_router->StartProduction(evt))
+ return TRUE;
+
+ m_snderror = m_router->GetError();
+ m_lastcount = m_router->GetLastAccess();
+ return FALSE;
+}
+
+// --------------------------------------------------------------------------
+// StopProduction(). See sndbase.h
+// --------------------------------------------------------------------------
+bool wxSoundRouterStream::StopProduction()
+{
+ if (!m_router) {
+ if (m_sndio->StopProduction())
+ return TRUE;
+
+ m_snderror = m_sndio->GetError();
+ m_lastcount = m_sndio->GetLastAccess();
+ return FALSE;
+ }
+
+ if (m_router->StopProduction())
+ return TRUE;
+
+ m_snderror = m_router->GetError();
+ m_lastcount = m_router->GetLastAccess();
+ return FALSE;
+}
+
+// --------------------------------------------------------------------------
+// wxSoundFileStream: generic reader
+// --------------------------------------------------------------------------
+
+wxSoundFileStream::wxSoundFileStream(wxInputStream& stream,
+ wxSoundStream& io_sound)
+ : m_codec(io_sound), m_sndio(&io_sound),
+ m_input(&stream), m_output(NULL), m_state(wxSOUND_FILE_STOPPED)
+{
+ m_length = 0;
+ m_bytes_left = 0;
+ m_prepared = FALSE;
+}
+
+wxSoundFileStream::wxSoundFileStream(wxOutputStream& stream,
+ wxSoundStream& io_sound)
+ : m_codec(io_sound), m_sndio(&io_sound),
+ m_input(NULL), m_output(&stream), m_state(wxSOUND_FILE_STOPPED)
+{
+ m_length = 0;
+ m_bytes_left = 0;
+ m_prepared = FALSE;
+}
+
+wxSoundFileStream::~wxSoundFileStream()
+{
+ if (m_state != wxSOUND_FILE_STOPPED)
+ Stop();
+}
+
+bool wxSoundFileStream::Play()
+{
+ if (m_state != wxSOUND_FILE_STOPPED)
+ return FALSE;
+
+ if (!m_prepared)
+ if (!PrepareToPlay())
+ return FALSE;
+
+ m_state = wxSOUND_FILE_PLAYING;
+
+ if (!StartProduction(wxSOUND_OUTPUT))
+ return FALSE;
+
+ return TRUE;
+}
+
+bool wxSoundFileStream::Record(wxUint32 time)
+{
+ if (m_state != wxSOUND_FILE_STOPPED)
+ return FALSE;
+
+ if (!PrepareToRecord(time))
+ return FALSE;
+
+ FinishPreparation(m_sndformat->GetBytesFromTime(time));
+
+ m_state = wxSOUND_FILE_RECORDING;
+ if (!StartProduction(wxSOUND_INPUT))
+ return FALSE;
+
+ return TRUE;
+}
+
+bool wxSoundFileStream::Stop()
+{
+ if (m_state == wxSOUND_FILE_STOPPED)
+ return FALSE;
+
+ if (!StopProduction())
+ return FALSE;
+
+ m_prepared = FALSE;
+
+ if (m_state == wxSOUND_FILE_RECORDING)
+ if (!FinishRecording()) {
+ m_state = wxSOUND_FILE_STOPPED;
+ return FALSE;
+ }
+
+ if (m_input)
+ m_input->SeekI(0, wxFromStart);
+
+ if (m_output)
+ m_output->SeekO(0, wxFromStart);
+
+ m_state = wxSOUND_FILE_STOPPED;
+ return TRUE;
+}
+
+bool wxSoundFileStream::Pause()
+{
+ if (m_state == wxSOUND_FILE_PAUSED || m_state == wxSOUND_FILE_STOPPED)
+ return FALSE;
+
+ if (!StopProduction())
+ return FALSE;
+
+ m_oldstate = m_state;
+ m_state = wxSOUND_FILE_PAUSED;
+ return TRUE;
+}
+
+bool wxSoundFileStream::Resume()
+{
+ if (m_state == wxSOUND_FILE_PLAYING || m_state == wxSOUND_FILE_RECORDING ||
+ m_state == wxSOUND_FILE_STOPPED)
+ return FALSE;
+
+ if (!StartProduction( (m_oldstate == wxSOUND_FILE_PLAYING) ?
+ wxSOUND_OUTPUT : wxSOUND_INPUT))
+ return FALSE;
+
+ m_state = m_oldstate;
+
+ return TRUE;
+}
+
+wxSoundStream& wxSoundFileStream::Read(void *buffer, wxUint32 len)
+{
+ if (!m_prepared || m_state != wxSOUND_FILE_PLAYING) {
+ m_snderror = wxSOUND_NOTSTARTED;
+ m_lastcount = 0;
+ return *this;
+ }
+ m_lastcount = GetData(buffer, len);
+ return *this;
+}
+
+wxSoundStream& wxSoundFileStream::Write(const void *buffer, wxUint32 len)
+{
+ if (!m_prepared || m_state != wxSOUND_FILE_RECORDING) {
+ m_snderror = wxSOUND_NOTSTARTED;
+ m_lastcount = 0;
+ return *this;
+ }
+ m_lastcount = PutData(buffer, len);
+ return *this;
+}
+
+bool wxSoundFileStream::StartProduction(int evt)
+{
+ m_sndio->SetEventHandler(this);
+
+ if (!m_codec.StartProduction(evt))
+ return FALSE;
+
+ return TRUE;
+}
+
+bool wxSoundFileStream::StopProduction()
+{
+ return m_codec.StopProduction();
+}
+
+void wxSoundFileStream::FinishPreparation(wxUint32 len)
+{
+ m_bytes_left = m_length = len;
+ m_prepared = TRUE;
+}
+
+wxString wxSoundFileStream::GetCodecName() const
+{
+ return wxString(wxT("wxSoundFileStream base codec"));
+}
+
+wxUint32 wxSoundFileStream::GetLength()
+{
+ if (m_input && !m_prepared && GetError() == wxSOUND_NOERROR)
+ return (PrepareToPlay()) ? m_length : 0;
+
+ return m_length;
+}
+
+wxUint32 wxSoundFileStream::GetPosition()
+{
+ if (!m_prepared && m_input != NULL && GetError() == wxSOUND_NOERROR)
+ PrepareToPlay();
+
+ return m_length-m_bytes_left;
+}
+
+wxUint32 wxSoundFileStream::SetPosition(wxUint32 new_position)
+{
+ if (!m_prepared && m_input != NULL && GetError() == wxSOUND_NOERROR)
+ PrepareToPlay();
+
+ if (!m_prepared)
+ return 0;
+
+ if (!RepositionStream(new_position))
+ return m_length-m_bytes_left;
+
+ if (new_position >= m_length) {
+ m_bytes_left = 0;
+ return m_length;
+ }
+
+ m_bytes_left = m_length-new_position;
+ return new_position;
+}
+
+void wxSoundFileStream::OnSoundEvent(int evt)
+{
+ wxUint32 len = m_codec.GetBestSize();
+ char *buffer;
+
+ buffer = new char[len];
+ wxSoundStream::OnSoundEvent(evt);
+
+ while (!m_sndio->QueueFilled()) {
+ switch(evt) {
+ case wxSOUND_INPUT:
+ if (len > m_bytes_left)
+ len = m_bytes_left;
+
+ len = m_codec.Read(buffer, len).GetLastAccess();
+ PutData(buffer, len);
+ m_bytes_left -= len;
+ if (m_bytes_left == 0) {
+ Stop();
+ delete[] buffer;
+ return;
+ }
+ break;
+ case wxSOUND_OUTPUT:
+ if (len > m_bytes_left)
+ len = m_bytes_left;
+
+ len = GetData(buffer, len);
+ m_bytes_left -= len;
+ if (m_bytes_left == 0) {
+ Stop();
+ delete[] buffer;
+ return;
+ }
+ m_codec.Write(buffer, len);
+ break;
+ }
+ }
+ delete[] buffer;
+}
+
+bool wxSoundFileStream::SetSoundFormat(const wxSoundFormatBase& format)
+{
+ wxSoundStream::SetSoundFormat(format);
+ return m_codec.SetSoundFormat(format);
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndg72x.cpp
+// Purpose:
+// Date: 08/26/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndg72x.cpp"
+#endif
+
+#include <wx/wxprec.h>
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+#endif
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndfile.h"
+#include "wx/mmedia/sndpcm.h"
+#include "wx/mmedia/sndg72x.h"
+#include "wx/mmedia/internal/g72x.h"
+
+// --------------------------------------------------------------------------
+// wxSoundFormatG72X
+// --------------------------------------------------------------------------
+
+wxSoundFormatG72X::wxSoundFormatG72X()
+ : m_srate(22050)
+{
+}
+
+wxSoundFormatG72X::~wxSoundFormatG72X()
+{
+}
+
+void wxSoundFormatG72X::SetSampleRate(wxUint32 srate)
+{
+ m_srate = srate;
+}
+
+wxUint32 wxSoundFormatG72X::GetSampleRate() const
+{
+ return m_srate;
+}
+
+void wxSoundFormatG72X::SetG72XType(wxSoundG72XType type)
+{
+ m_g72x_type = type;
+}
+
+wxSoundFormatBase *wxSoundFormatG72X::Clone() const
+{
+ wxSoundFormatG72X *g72x = new wxSoundFormatG72X();
+
+ g72x->m_srate = m_srate;
+ g72x->m_g72x_type = m_g72x_type;
+ return g72x;
+}
+
+wxUint32 wxSoundFormatG72X::GetTimeFromBytes(wxUint32 bytes) const
+{
+ int n_bits;
+
+ switch (m_g72x_type) {
+ case wxSOUND_G721:
+ n_bits = 4;
+ break;
+ case wxSOUND_G723_24:
+ n_bits = 3;
+ break;
+ case wxSOUND_G723_40:
+ n_bits = 5;
+ break;
+ default:
+ n_bits = 0;
+ break;
+ }
+ return (wxUint32)((bytes / m_srate) * n_bits) / 8;
+}
+
+wxUint32 wxSoundFormatG72X::GetBytesFromTime(wxUint32 time) const
+{
+ int n_bits;
+
+ switch (m_g72x_type) {
+ case wxSOUND_G721:
+ n_bits = 4;
+ break;
+ case wxSOUND_G723_24:
+ n_bits = 3;
+ break;
+ case wxSOUND_G723_40:
+ n_bits = 5;
+ break;
+ default:
+ n_bits = 0;
+ }
+ return (wxUint32)((time * m_srate * n_bits) / 8);
+}
+
+bool wxSoundFormatG72X::operator !=(const wxSoundFormatBase& frmt2) const
+{
+ wxSoundFormatG72X *g72x = (wxSoundFormatG72X *)&frmt2;
+
+ if (frmt2.GetType() != wxSOUND_G72X)
+ return TRUE;
+
+ return (g72x->m_srate != m_srate || g72x->m_g72x_type != m_g72x_type);
+}
+
+// --------------------------------------------------------------------------
+// wxSoundStreamG72X
+// --------------------------------------------------------------------------
+
+wxSoundStreamG72X::wxSoundStreamG72X(wxSoundStream& sndio)
+ : wxSoundStreamCodec(sndio)
+{
+ // PCM converter
+ m_router = new wxSoundRouterStream(sndio);
+ m_state = new g72state;
+ g72x_init_state(m_state);
+}
+
+wxSoundStreamG72X::~wxSoundStreamG72X()
+{
+ delete m_router;
+}
+
+wxSoundStream& wxSoundStreamG72X::Read(void *buffer, wxUint32 len)
+{
+ wxUint16 *old_linear;
+ register wxUint16 *linear_buffer;
+ register wxUint32 real_len;
+ register wxUint32 countdown = len;
+
+ real_len = (len * 8 / m_n_bits);
+
+ old_linear = linear_buffer = new wxUint16[real_len];
+
+ m_router->Read(linear_buffer, real_len);
+
+ real_len = (wxUint32)(m_router->GetLastAccess() * ((float)m_n_bits / 8));
+ if (!real_len)
+ return *m_router;
+
+ m_io_buffer = (wxUint8 *)buffer;
+ m_current_b_pos = 0;
+
+ while (countdown != 0) {
+ PutBits(m_coder(*linear_buffer++, AUDIO_ENCODING_LINEAR, m_state));
+ countdown--;
+ }
+ m_lastcount = real_len;
+ m_snderror = m_router->GetError();
+
+ delete[] old_linear;
+
+ return *this;
+}
+
+wxSoundStream& wxSoundStreamG72X::Write(const void *buffer, wxUint32 len)
+{
+ wxUint16 *old_linear;
+ register wxUint16 *linear_buffer;
+ register wxUint32 countdown = len;
+ register wxUint32 real_len;
+
+ // Compute the real length (PCM format) to sendt to the sound card
+ real_len = (len * m_n_bits / 8);
+
+ // Allocate a temporary buffer
+ old_linear = linear_buffer = new wxUint16[real_len];
+
+ // Bad, we override the const
+ m_io_buffer = (wxUint8 *)buffer;
+ m_current_b_pos = 0;
+
+ // Decode the datas
+ while (countdown != 0) {
+ *linear_buffer++ = m_decoder(GetBits(), AUDIO_ENCODING_LINEAR, m_state);
+ countdown--;
+ }
+ m_lastcount = len;
+
+ // Send them to the sound card
+ m_router->Write(old_linear, real_len);
+
+ // Destroy the temporary buffer
+ delete[] old_linear;
+
+ return *m_router;
+}
+
+bool wxSoundStreamG72X::SetSoundFormat(const wxSoundFormatBase& format)
+{
+ if (format.GetType() != wxSOUND_G72X) {
+ m_snderror = wxSOUND_INVFRMT;
+ return FALSE;
+ }
+
+ wxSoundFormatPcm pcm;
+ wxSoundFormatG72X *g72x;
+
+ wxSoundStreamCodec::SetSoundFormat(format);
+
+ g72x = (wxSoundFormatG72X *)m_sndformat;
+
+ // Set PCM as the output format of the codec
+ pcm.SetSampleRate(g72x->GetSampleRate());
+ pcm.SetBPS(16);
+ pcm.SetChannels(1); // Only mono supported
+ pcm.Signed(TRUE);
+ pcm.SetOrder(wxBYTE_ORDER);
+
+ // Look for the correct codec to use and set its bit width
+ switch (g72x->GetG72XType()) {
+ case wxSOUND_G721:
+ m_n_bits = 4;
+ m_coder = g721_encoder;
+ m_decoder = g721_decoder;
+ break;
+ case wxSOUND_G723_24:
+ m_n_bits = 3;
+ m_coder = g723_24_encoder;
+ m_decoder = g723_24_decoder;
+ break;
+ case wxSOUND_G723_40:
+ m_n_bits = 5;
+ m_coder = g723_40_encoder;
+ m_decoder = g723_40_decoder;
+ break;
+ }
+
+ // Let the router finish the work
+ m_router->SetSoundFormat(pcm);
+
+ return TRUE;
+}
+
+#define BYTE_SIZE 8
+
+wxUint8 wxSoundStreamG72X::GetBits()
+{
+ register wxUint8 bits;
+
+ // We have two bytes to compute
+ if (m_current_b_pos < m_n_bits) {
+ register wxUint8 b_left;
+
+ // TRANSLATE the mask
+ m_current_mask >>= m_current_b_pos;
+
+ // GET the last bits: 0001..1
+ bits = (m_current_byte & m_current_mask) << (m_n_bits - m_current_b_pos);
+
+ // GEN: 1. n times .1000
+ b_left = BYTE_SIZE-m_n_bits;
+ m_current_mask = ((1 << m_n_bits) - 1) << b_left;
+
+ // GET the next byte
+ m_current_byte = *m_io_buffer++;
+
+ register wxUint8 tmp_mask;
+
+ // COMPUTE a new temporary mask to get the last bits
+ b_left = m_n_bits - b_left;
+ tmp_mask = (1 << b_left) - 1;
+ // TRANSLATE the old mask to get ready for the next time
+ m_current_mask >>= b_left;
+
+ // COMPUTE the new bit position
+ b_left = BYTE_SIZE - b_left;
+ m_current_b_pos = b_left;
+ tmp_mask <<= b_left;
+
+ // GET the last bits
+ bits |= (m_current_byte & tmp_mask) >> b_left;
+ } else {
+ m_current_mask >>= m_n_bits;
+ m_current_b_pos -= m_n_bits;
+ bits = (m_current_byte & m_current_mask) >> m_current_b_pos;
+ }
+ return bits;
+}
+
+void wxSoundStreamG72X::PutBits(wxUint8 bits)
+{
+ if (m_current_b_pos < m_n_bits) {
+ register wxUint8 tmp_mask;
+ register wxUint8 diff;
+
+ diff = m_n_bits - m_current_b_pos;
+ // Pack bits and put the byte in the buffer
+ m_current_byte |= bits >> diff;
+ *m_io_buffer++ = m_current_byte;
+
+ // Gen a mask
+ tmp_mask = ~((1 << diff) - 1);
+
+ m_current_b_pos = BYTE_SIZE - (m_n_bits - m_current_b_pos);
+
+ m_current_byte = (bits & (tmp_mask)) << m_current_b_pos;
+ } else {
+ m_current_b_pos -= m_n_bits;
+ bits <<= m_current_b_pos;
+ m_current_byte |= bits;
+ }
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndulaw.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndulaw.cpp"
+#endif
+
+#include <wx/wxprec.h>
+#include "sndbase.h"
+#include "sndfile.h"
+#include "sndpcm.h"
+#include "sndmsad.h"
+
+// --------------------------------------------------------------------------
+// wxSoundFormatMSAdpcm
+// --------------------------------------------------------------------------
+
+wxSoundFormatMSAdpcm::wxSoundFormatMSAdpcm()
+ : m_srate(22050)
+{
+ m_coefs = new wxMSAdpcmCoefs();
+}
+
+wxSoundFormatMSAdpcm::~wxSoundFormatMSAdpcm()
+{
+ delete m_coefs;
+}
+
+void wxSoundFormatMSAdpcm::SetSampleRate(wxUint32 srate)
+{
+ m_srate = srate;
+}
+
+wxUint32 wxSoundFormatMSAdpcm::GetSampleRate() const
+{
+ return m_srate;
+}
+
+wxSoundFormatBase *wxSoundFormatMSAdpcm::Clone() const
+{
+ wxSoundFormatMSAdpcm *adpcm = new wxSoundFormatMSAdpcm();
+
+ adpcm->m_srate = m_srate;
+ adpcm->m_coefs = new wxMSAdpcmCoefs();
+ *(adpcm->m_coefs) = *m_coefs;
+ return adpcm;
+}
+
+wxUint32 wxSoundFormatMSAdpcm::GetTimeFromBytes(wxUint32 bytes) const
+{
+ return 0;
+}
+
+wxUint32 wxSoundFormatMSAdpcm::GetBytesFromTime(wxUint32 time) const
+{
+ return 0;
+}
+
+bool wxSoundFormatMSAdpcm::operator !=(const wxSoundFormatBase& frmt2) const
+{
+ wxSoundFormatUlaw *adpcm = (wxSoundFormatMSAdpcm *)&frmt2;
+
+ if (frmt2.GetType() != wxSOUND_MSADPCM)
+ return TRUE;
+
+ return (adpcm->m_srate != m_srate) && 0;
+}
+
+// --------------------------------------------------------------------------
+// wxSoundStreamMSAdpcm
+// --------------------------------------------------------------------------
+wxSoundStreamMSAdpcm::wxSoundStreamMSAdpcm(wxSoundStream& sndio)
+ : wxSoundStreamCodec(sndio)
+{
+ // PCM converter
+ m_router = new wxSoundRouterStream(sndio);
+ m_got_header = FALSE;
+}
+
+wxSoundStreamMSAdpcm::~wxSoundStreamMSAdpcm()
+{
+ delete m_router;
+}
+
+wxSoundStream& wxSoundStreamMSAdpcm::Read(void *buffer, wxUint32 len)
+{
+ m_snderror = wxSOUND_NOCODEC;
+ m_lastcount = 0;
+ return *this;
+}
+
+static wxInt16 gl_ADPCMcoeff_delta[] = {
+ 230, 230, 230, 230, 307, 409, 512, 614, 768, 614, 512, 409, 307, 230, 230, 230
+};
+
+static wxInt16 gl_ADPCMcoeff_1[] = {
+ 256, 512, 0, 192, 240, 460, 392
+};
+
+static wxInt16 gl_ADPCMcoeff_2[] = {
+ 0, -256, 0, 64, 0, -208, -232
+};
+
+wxSoundStream& wxSoundStreamMSAdpcm::Write(const void *buffer, wxUint32 len)
+{
+ wxInt16 delta;
+ wxUint8 ADPCMdata;
+ wxUint16 *PCMdata;
+ wxInt16 coeff1, coeff2;
+
+#define GET_DATA_16 (*ADPCMdata++ | ((wxUint32)(*ADPCMdata++) << 8);
+#define GET_DATA_8 (*ADPCMdata++)
+
+ if (!m_got_header) {
+ i_predict = GET_DATA_8;
+ delta = GET_DATA_16;
+ samp1 = GET_DATA_16;
+ PCMdata = GET_DATA_16;
+ len -= 3*2 + 1;
+ m_got_header = TRUE;
+
+ coeff1 = gl_ADPCMcoeff_1[i_predict];
+ coeff2 = gl_ADPCMcoeff_2[i_predict];
+ }
+
+ while (len > 0) {
+ nyb1 = GET_DATA_8;
+ nyb0 = (nyb1 & 0xf0) >> 4;
+ nyb1 &= 0x0f;
+
+
+ return *this;
+}
+
+wxUint32 wxSoundStreamMSAdpcm::GetBestSize() const
+{
+ return m_sndio->GetBestSize() / 2;
+}
+
+bool wxSoundStreamMSAdpcm::SetSoundFormat(const wxSoundFormatBase& format)
+{
+ if (format.GetType() != wxSOUND_ULAW) {
+ m_snderror = wxSOUND_INVFRMT;
+ return FALSE;
+ }
+
+ wxSoundFormatPcm pcm;
+ wxSoundFormatUlaw *ulaw;
+
+ wxSoundStreamCodec::SetSoundFormat(format);
+
+ ulaw = (wxSoundFormatMSAdpcm *)m_sndformat;
+
+ pcm.SetSampleRate(adpcm->GetSampleRate());
+ pcm.SetBPS(16);
+ pcm.SetChannels(adpcm->GetChannels());
+ pcm.Signed(TRUE);
+ pcm.SetOrder(wxBYTE_ORDER);
+
+ m_router->SetSoundFormat(pcm);
+
+ return TRUE;
+}
+
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndoss.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999, 2000
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndoss.cpp"
+#endif
+
+// --------------------------------------------------------------------------
+// System dependent headers
+// --------------------------------------------------------------------------
+
+#include <sys/soundcard.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <unistd.h>
+#ifdef __WXGTK__
+#include <gdk/gdk.h>
+#endif
+
+// --------------------------------------------------------------------------
+// wxWindows headers
+// --------------------------------------------------------------------------
+#include "wx/defs.h"
+#include "wx/string.h"
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndoss.h"
+#include "wx/mmedia/sndpcm.h"
+
+wxSoundStreamOSS::wxSoundStreamOSS(const wxString& dev_name)
+{
+ wxSoundFormatPcm pcm_default;
+
+ // Open the OSS device
+ m_fd = open(dev_name.mb_str(), O_WRONLY);
+ if (m_fd == -1) {
+ // OSS not found
+ m_oss_ok = FALSE;
+ m_snderror = wxSOUND_INVDEV;
+ return;
+ }
+
+ // Remember the device name
+ m_devname = dev_name;
+
+ // Initialize the default format
+ wxSoundStreamOSS::SetSoundFormat(pcm_default);
+
+ // Get the default best size for OSS
+ ioctl(m_fd, SNDCTL_DSP_GETBLKSIZE, &m_bufsize);
+
+ m_snderror = wxSOUND_NOERROR;
+
+ // Close OSS
+ close(m_fd);
+
+ m_oss_ok = TRUE;
+ m_oss_stop = TRUE;
+ m_q_filled = TRUE;
+}
+
+wxSoundStreamOSS::~wxSoundStreamOSS()
+{
+ if (m_fd > 0)
+ close(m_fd);
+}
+
+wxUint32 wxSoundStreamOSS::GetBestSize() const
+{
+ return m_bufsize;
+}
+
+wxSoundStream& wxSoundStreamOSS::Read(void *buffer, wxUint32 len)
+{
+ int ret;
+
+ if (m_oss_stop) {
+ m_snderror = wxSOUND_NOTSTARTED;
+ m_lastcount = 0;
+ return *this;
+ }
+
+ m_lastcount = (wxUint32)ret = read(m_fd, buffer, len);
+ m_q_filled = TRUE;
+
+ if (ret < 0)
+ m_snderror = wxSOUND_IOERROR;
+ else
+ m_snderror = wxSOUND_NOERROR;
+
+ return *this;
+}
+
+wxSoundStream& wxSoundStreamOSS::Write(const void *buffer, wxUint32 len)
+{
+ int ret;
+
+ if (m_oss_stop) {
+ m_snderror = wxSOUND_NOTSTARTED;
+ m_lastcount= 0;
+ return *this;
+ }
+
+ ret = write(m_fd, buffer, len);
+ m_q_filled = TRUE;
+
+ if (ret < 0) {
+ m_lastcount = 0;
+ m_snderror = wxSOUND_IOERROR;
+ } else {
+ m_snderror = wxSOUND_NOERROR;
+ m_lastcount = (wxUint32)ret;
+ }
+
+ return *this;
+}
+
+bool wxSoundStreamOSS::SetSoundFormat(const wxSoundFormatBase& format)
+{
+ int tmp;
+ wxSoundFormatPcm *pcm_format;
+
+ if (format.GetType() != wxSOUND_PCM) {
+ m_snderror = wxSOUND_INVFRMT;
+ return FALSE;
+ }
+
+ if (!m_oss_ok) {
+ m_snderror = wxSOUND_INVDEV;
+ return FALSE;
+ }
+
+ if (m_sndformat)
+ delete m_sndformat;
+
+ m_sndformat = format.Clone();
+ if (!m_sndformat) {
+ m_snderror = wxSOUND_MEMERROR;
+ return FALSE;
+ }
+ pcm_format = (wxSoundFormatPcm *)m_sndformat;
+
+ // We temporary open the OSS device
+ if (m_oss_stop) {
+ m_fd = open(m_devname.mb_str(), O_WRONLY);
+ if (m_fd == -1) {
+ m_snderror = wxSOUND_INVDEV;
+ return FALSE;
+ }
+ }
+
+ // Set the sample rate field.
+ tmp = pcm_format->GetSampleRate();
+ ioctl(m_fd, SNDCTL_DSP_SPEED, &tmp);
+
+ pcm_format->SetSampleRate(tmp);
+
+ // Detect the best format
+ DetectBest(pcm_format);
+ // Try to apply it
+ SetupFormat(pcm_format);
+
+ tmp = pcm_format->GetChannels();
+ ioctl(m_fd, SNDCTL_DSP_CHANNELS, &tmp);
+ pcm_format->SetChannels(tmp);
+
+ // Close the OSS device
+ if (m_oss_stop)
+ close(m_fd);
+
+ m_snderror = wxSOUND_NOERROR;
+ if (*pcm_format != format) {
+ m_snderror = wxSOUND_NOEXACT;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+bool wxSoundStreamOSS::SetupFormat(wxSoundFormatPcm *pcm_format)
+{
+ int tmp;
+
+ switch(pcm_format->GetBPS()) {
+ case 8:
+ if (pcm_format->Signed())
+ tmp = AFMT_S8;
+ else
+ tmp = AFMT_U8;
+ break;
+ case 16:
+ switch (pcm_format->GetOrder()) {
+ case wxBIG_ENDIAN:
+ if (pcm_format->Signed())
+ tmp = AFMT_S16_BE;
+ else
+ tmp = AFMT_U16_BE;
+ break;
+ case wxLITTLE_ENDIAN:
+ if (pcm_format->Signed())
+ tmp = AFMT_S16_LE;
+ else
+ tmp = AFMT_U16_LE;
+ break;
+ }
+ break;
+ }
+
+ ioctl(m_fd, SNDCTL_DSP_SETFMT, &tmp);
+
+ // Demangling.
+ switch (tmp) {
+ case AFMT_U8:
+ pcm_format->SetBPS(8);
+ pcm_format->Signed(FALSE);
+ break;
+ case AFMT_S8:
+ pcm_format->SetBPS(8);
+ pcm_format->Signed(TRUE);
+ break;
+ case AFMT_U16_LE:
+ pcm_format->SetBPS(16);
+ pcm_format->Signed(FALSE);
+ pcm_format->SetOrder(wxLITTLE_ENDIAN);
+ break;
+ case AFMT_U16_BE:
+ pcm_format->SetBPS(16);
+ pcm_format->Signed(FALSE);
+ pcm_format->SetOrder(wxBIG_ENDIAN);
+ break;
+ case AFMT_S16_LE:
+ pcm_format->SetBPS(16);
+ pcm_format->Signed(TRUE);
+ pcm_format->SetOrder(wxLITTLE_ENDIAN);
+ break;
+ case AFMT_S16_BE:
+ pcm_format->SetBPS(16);
+ pcm_format->Signed(TRUE);
+ pcm_format->SetOrder(wxBIG_ENDIAN);
+ break;
+ }
+ return TRUE;
+}
+
+#ifdef __WXGTK__
+static void _wxSound_OSS_CBack(gpointer data, int source,
+ GdkInputCondition condition)
+{
+ wxSoundStreamOSS *oss = (wxSoundStreamOSS *)data;
+
+ switch (condition) {
+ case GDK_INPUT_READ:
+ oss->WakeUpEvt(wxSOUND_INPUT);
+ break;
+ case GDK_INPUT_WRITE:
+ oss->WakeUpEvt(wxSOUND_OUTPUT);
+ break;
+ default:
+ break;
+ }
+}
+#endif
+
+void wxSoundStreamOSS::WakeUpEvt(int evt)
+{
+ m_q_filled = FALSE;
+ OnSoundEvent(evt);
+}
+
+bool wxSoundStreamOSS::StartProduction(int evt)
+{
+ wxSoundFormatBase *old_frmt;
+
+ if (!m_oss_stop)
+ StopProduction();
+
+ old_frmt = m_sndformat->Clone();
+ if (!old_frmt) {
+ m_snderror = wxSOUND_MEMERROR;
+ return FALSE;
+ }
+
+ if (evt == wxSOUND_OUTPUT)
+ m_fd = open(m_devname.mb_str(), O_WRONLY);
+ else if (evt == wxSOUND_INPUT)
+ m_fd = open(m_devname.mb_str(), O_RDONLY);
+
+ if (m_fd == -1) {
+ m_snderror = wxSOUND_INVDEV;
+ return FALSE;
+ }
+
+ SetSoundFormat(*old_frmt);
+ delete old_frmt;
+
+ int trig;
+
+ if (evt == wxSOUND_OUTPUT) {
+#ifdef __WXGTK__
+ m_tag = gdk_input_add(m_fd, GDK_INPUT_WRITE, _wxSound_OSS_CBack, (gpointer)this);
+#endif
+ trig = PCM_ENABLE_OUTPUT;
+ } else {
+#ifdef __WXGTK__
+ m_tag = gdk_input_add(m_fd, GDK_INPUT_READ, _wxSound_OSS_CBack, (gpointer)this);
+#endif
+ trig = PCM_ENABLE_INPUT;
+ }
+
+ ioctl(m_fd, SNDCTL_DSP_SETTRIGGER, &trig);
+
+ m_oss_stop = FALSE;
+ m_q_filled = FALSE;
+
+ return TRUE;
+}
+
+bool wxSoundStreamOSS::StopProduction()
+{
+ if (m_oss_stop)
+ return FALSE;
+
+#ifdef __WXGTK__
+ gdk_input_remove(m_tag);
+#endif
+
+ close(m_fd);
+ m_oss_stop = TRUE;
+ m_q_filled = TRUE;
+ return TRUE;
+}
+
+bool wxSoundStreamOSS::QueueFilled() const
+{
+ return m_q_filled;
+}
+
+//
+// Detect the closest format (The best).
+//
+void wxSoundStreamOSS::DetectBest(wxSoundFormatPcm *pcm)
+{
+#define MASK_16BITS (AFMT_S16_LE | AFMT_S16_BE | AFMT_U16_LE | AFMT_U16_BE)
+
+ int fmt_mask;
+ wxSoundFormatPcm best_pcm;
+
+ // We change neither the number of channels nor the sample rate
+
+ best_pcm.SetSampleRate(pcm->GetSampleRate());
+ best_pcm.SetChannels(pcm->GetChannels());
+
+ // Get the supported format by the sound card
+ ioctl(m_fd, SNDCTL_DSP_GETFMTS, &fmt_mask);
+
+ // It supports 16 bits
+ if (pcm->GetBPS() == 16 && ((fmt_mask & MASK_16BITS) != 0))
+ best_pcm.SetBPS(16);
+
+ // It supports big endianness
+ if (pcm->GetOrder() == wxBIG_ENDIAN &&
+ ((fmt_mask & (AFMT_S16_BE | AFMT_U16_BE)) != 0))
+ best_pcm.SetOrder(wxBIG_ENDIAN);
+
+ // It supports little endianness
+ if (pcm->GetOrder() == wxLITTLE_ENDIAN &&
+ ((fmt_mask & (AFMT_S16_LE | AFMT_U16_LE)) != 0))
+ best_pcm.SetOrder(wxLITTLE_ENDIAN);
+
+ // It supports signed samples
+ if (pcm->Signed() &&
+ ((fmt_mask & (AFMT_S16_LE | AFMT_S16_BE | AFMT_S8)) != 0))
+ best_pcm.Signed(TRUE);
+
+ // It supports unsigned samples
+ if (!pcm->Signed() &&
+ ((fmt_mask & (AFMT_U16_LE | AFMT_U16_BE | AFMT_U8)) != 0))
+ best_pcm.Signed(FALSE);
+
+ // Finally recopy the new format
+ *pcm = best_pcm;
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndpcm.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndpcm.cpp"
+#endif
+
+#include <wx/wxprec.h>
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+#endif
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndpcm.h"
+
+wxSoundFormatPcm::wxSoundFormatPcm(wxUint32 srate, wxUint8 bps,
+ wxUint16 nchannels, bool sign,
+ int order)
+ : m_srate(srate), m_bps(bps), m_nchan(nchannels), m_order(order),
+ m_signed(sign)
+{
+}
+
+wxSoundFormatPcm::~wxSoundFormatPcm()
+{
+}
+
+void wxSoundFormatPcm::SetSampleRate(wxUint32 srate)
+{
+ m_srate = srate;
+}
+
+void wxSoundFormatPcm::SetBPS(wxUint8 bps)
+{
+ m_bps = bps;
+}
+
+void wxSoundFormatPcm::SetChannels(wxUint16 nchannels)
+{
+ m_nchan = nchannels;
+}
+
+void wxSoundFormatPcm::SetOrder(int order)
+{
+ m_order = order;
+}
+
+void wxSoundFormatPcm::Signed(bool sign)
+{
+ m_signed = sign;
+}
+
+wxSoundFormatBase *wxSoundFormatPcm::Clone() const
+{
+ wxSoundFormatPcm *new_pcm;
+
+ new_pcm = new wxSoundFormatPcm();
+ new_pcm->m_srate = m_srate;
+ new_pcm->m_bps = m_bps;
+ new_pcm->m_nchan = m_nchan;
+ new_pcm->m_order = m_order;
+ new_pcm->m_signed= m_signed;
+
+ return new_pcm;
+}
+
+wxUint32 wxSoundFormatPcm::GetTimeFromBytes(wxUint32 bytes) const
+{
+ return (bytes / (m_srate * (m_bps / 8) * m_nchan));
+}
+
+wxUint32 wxSoundFormatPcm::GetBytesFromTime(wxUint32 time) const
+{
+ return (time * (m_srate * (m_bps / 8) * m_nchan));
+}
+
+bool wxSoundFormatPcm::operator!=(const wxSoundFormatBase& format) const
+{
+ wxSoundFormatPcm *format2 = (wxSoundFormatPcm *)&format;
+
+ if (format.GetType() != wxSOUND_PCM)
+ return TRUE;
+
+ return ( (m_srate != format2->m_srate) ||
+ (m_bps != format2->m_bps) ||
+ (m_nchan != format2->m_nchan) ||
+ (m_order != format2->m_order) ||
+ (m_signed != format2->m_signed) );
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndulaw.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndulaw.cpp"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+#endif
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndfile.h"
+#include "wx/mmedia/sndpcm.h"
+#include "wx/mmedia/sndulaw.h"
+#include "wx/mmedia/internal/g72x.h"
+
+// --------------------------------------------------------------------------
+// wxSoundFormatUlaw
+// --------------------------------------------------------------------------
+
+wxSoundFormatUlaw::wxSoundFormatUlaw()
+ : m_srate(22050), m_channels(1)
+{
+}
+
+wxSoundFormatUlaw::~wxSoundFormatUlaw()
+{
+}
+
+void wxSoundFormatUlaw::SetSampleRate(wxUint32 srate)
+{
+ m_srate = srate;
+}
+
+wxUint32 wxSoundFormatUlaw::GetSampleRate() const
+{
+ return m_srate;
+}
+
+wxUint8 wxSoundFormatUlaw::GetChannels() const
+{
+ return m_channels;
+}
+
+void wxSoundFormatUlaw::SetChannels(wxUint8 nchannels)
+{
+ m_channels = nchannels;
+}
+
+wxSoundFormatBase *wxSoundFormatUlaw::Clone() const
+{
+ wxSoundFormatUlaw *ulaw = new wxSoundFormatUlaw();
+
+ ulaw->m_srate = m_srate;
+ ulaw->m_channels = m_channels;
+ return ulaw;
+}
+
+wxUint32 wxSoundFormatUlaw::GetTimeFromBytes(wxUint32 bytes) const
+{
+ return (bytes / m_srate);
+}
+
+wxUint32 wxSoundFormatUlaw::GetBytesFromTime(wxUint32 time) const
+{
+ return time * m_srate;
+}
+
+bool wxSoundFormatUlaw::operator !=(const wxSoundFormatBase& frmt2) const
+{
+ wxSoundFormatUlaw *ulaw = (wxSoundFormatUlaw *)&frmt2;
+
+ if (frmt2.GetType() != wxSOUND_ULAW)
+ return TRUE;
+
+ return (ulaw->m_srate != m_srate);
+}
+
+// --------------------------------------------------------------------------
+// wxSoundStreamUlaw
+// --------------------------------------------------------------------------
+wxSoundStreamUlaw::wxSoundStreamUlaw(wxSoundStream& sndio)
+ : wxSoundStreamCodec(sndio)
+{
+ // PCM converter
+ m_router = new wxSoundRouterStream(sndio);
+}
+
+wxSoundStreamUlaw::~wxSoundStreamUlaw()
+{
+ delete m_router;
+}
+
+wxSoundStream& wxSoundStreamUlaw::Read(void *buffer, wxUint32 len)
+{
+ wxUint16 *old_linear;
+ register wxUint16 *linear_buffer;
+ register const wxUint8 *ulaw_buffer;
+ register wxUint32 countdown;
+
+ old_linear = linear_buffer = new wxUint16[len*2];
+ ulaw_buffer = (const wxUint8 *)buffer;
+
+ m_router->Read(linear_buffer, len * 2);
+
+ m_lastcount = countdown = m_router->GetLastAccess() / 2;
+ m_snderror = m_router->GetError();
+ if (m_snderror != wxSOUND_NOERROR)
+ return *this;
+
+ while (countdown > 0) {
+ *linear_buffer++ = ulaw2linear(*ulaw_buffer++);
+ countdown--;
+ }
+
+ delete[] old_linear;
+
+ return *m_router;
+}
+
+wxSoundStream& wxSoundStreamUlaw::Write(const void *buffer, wxUint32 len)
+{
+ wxUint16 *old_linear;
+ register wxUint16 *linear_buffer;
+ register const wxUint8 *ulaw_buffer;
+ register wxUint32 countdown = len;
+
+ old_linear = linear_buffer = new wxUint16[len*2];
+ ulaw_buffer = (const wxUint8 *)buffer;
+
+ while (countdown > 0) {
+ *linear_buffer++ = ulaw2linear(*ulaw_buffer++);
+ countdown--;
+ }
+
+ m_router->Write(old_linear, len * 2);
+
+ delete[] old_linear;
+
+ return *m_router;
+}
+
+wxUint32 wxSoundStreamUlaw::GetBestSize() const
+{
+ return m_sndio->GetBestSize() / 2;
+}
+
+bool wxSoundStreamUlaw::SetSoundFormat(const wxSoundFormatBase& format)
+{
+ if (format.GetType() != wxSOUND_ULAW) {
+ m_snderror = wxSOUND_INVFRMT;
+ return FALSE;
+ }
+
+ // As the codec only support 16 bits, Mono we must use a wxSoundRouter to filter the data and
+ // to translate them to a format supported by the sound card.
+
+ wxSoundFormatPcm pcm;
+ wxSoundFormatUlaw *ulaw;
+
+ wxSoundStreamCodec::SetSoundFormat(format);
+
+ ulaw = (wxSoundFormatUlaw *)m_sndformat;
+
+ pcm.SetSampleRate(ulaw->GetSampleRate());
+ pcm.SetBPS(16);
+ pcm.SetChannels(ulaw->GetChannels());
+ pcm.Signed(TRUE);
+ pcm.SetOrder(wxBYTE_ORDER);
+
+ m_router->SetSoundFormat(pcm);
+
+ return TRUE;
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndwav.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndwav.cpp"
+#endif
+
+#include <wx/wxprec.h>
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+#endif
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#include "wx/stream.h"
+#include "wx/datstrm.h"
+#include "wx/filefn.h"
+#include "wx/mstream.h"
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndcodec.h"
+#include "wx/mmedia/sndfile.h"
+#include "wx/mmedia/sndpcm.h"
+#include "wx/mmedia/sndg72x.h"
+#include "wx/mmedia/sndwav.h"
+
+#define BUILD_SIGNATURE(a,b,c,d) (((wxUint32)a) | (((wxUint32)b) << 8) | (((wxUint32)c) << 16) | (((wxUint32)d) << 24))
+
+#define RIFF_SIGNATURE BUILD_SIGNATURE('R','I','F','F')
+#define WAVE_SIGNATURE BUILD_SIGNATURE('W','A','V','E')
+#define FMT_SIGNATURE BUILD_SIGNATURE('f','m','t',' ')
+#define DATA_SIGNATURE BUILD_SIGNATURE('d','a','t','a')
+
+#define HEADER_SIZE 4+4 + 4+4+16 + 4+4
+// 4+4 => NAME + LEN
+// 16 => fmt size
+
+wxSoundWave::wxSoundWave(wxInputStream& stream, wxSoundStream& io_sound)
+ : wxSoundFileStream(stream, io_sound)
+{
+ m_base_offset = wxInvalidOffset;
+}
+
+wxSoundWave::wxSoundWave(wxOutputStream& stream, wxSoundStream& io_sound)
+ : wxSoundFileStream(stream, io_sound)
+{
+ m_base_offset = wxInvalidOffset;
+}
+
+wxSoundWave::~wxSoundWave()
+{
+}
+
+wxString wxSoundWave::GetCodecName() const
+{
+ return wxString(wxT("wxSoundWave codec"));
+}
+
+#define FAIL_WITH(condition, err) if (condition) { m_snderror = err; return FALSE; }
+
+bool wxSoundWave::CanRead()
+{
+ wxUint32 len, signature1, signature2;
+ m_snderror = wxSOUND_NOERROR;
+
+ // Test the main signatures:
+ // "RIFF"
+ FAIL_WITH(m_input->Read(&signature1, 4).LastRead() != 4, wxSOUND_INVSTRM);
+
+ if (wxUINT32_SWAP_ON_BE(signature1) != RIFF_SIGNATURE) {
+ m_input->Ungetch(&signature1, 4);
+ return FALSE;
+ }
+
+ // Pass the global length
+ m_input->Read(&len, 4);
+ FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);
+
+ // Get the second signature
+ FAIL_WITH(m_input->Read(&signature2, 4).LastRead() != 4, wxSOUND_INVSTRM);
+ // Ungetch all
+ m_input->Ungetch(&signature2, 4);
+ m_input->Ungetch(&len, 4);
+ m_input->Ungetch(&signature1, 4);
+
+ // Test the second signature
+ if (wxUINT32_SWAP_ON_BE(signature2) != WAVE_SIGNATURE)
+ return FALSE;
+
+ return TRUE;
+}
+
+bool wxSoundWave::HandleOutputPCM(wxDataInputStream& data, wxUint16 channels,
+ wxUint32 sample_fq, wxUint32 byte_p_sec,
+ wxUint16 byte_p_spl, wxUint16 bits_p_spl)
+{
+ wxSoundFormatPcm sndformat;
+
+ sndformat.SetSampleRate(sample_fq);
+ sndformat.SetBPS(bits_p_spl);
+ sndformat.SetChannels(channels);
+ sndformat.Signed(TRUE);
+ sndformat.SetOrder(wxLITTLE_ENDIAN);
+
+ if (!SetSoundFormat(sndformat))
+ return FALSE;
+
+ return TRUE;
+}
+
+bool wxSoundWave::HandleOutputG721(wxDataInputStream& data, wxUint16 channels,
+ wxUint32 sample_fq, wxUint32 byte_p_sec,
+ wxUint16 byte_p_spl, wxUint16 bits_p_spl)
+{
+ wxSoundFormatG72X sndformat;
+
+ sndformat.SetSampleRate(sample_fq);
+ sndformat.SetG72XType(wxSOUND_G721);
+
+ if (!SetSoundFormat(sndformat))
+ return FALSE;
+
+ return TRUE;
+}
+
+bool wxSoundWave::PrepareToPlay()
+{
+ wxUint32 signature, len;
+ bool end_headers;
+
+ if (!m_input) {
+ m_snderror = wxSOUND_INVSTRM;
+ return FALSE;
+ }
+
+ wxDataInputStream data(*m_input);
+ data.BigEndianOrdered(FALSE);
+
+ // Get the first signature
+ FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
+ FAIL_WITH(wxUINT32_SWAP_ON_BE(signature) != RIFF_SIGNATURE, wxSOUND_INVSTRM);
+ // "RIFF"
+
+ len = data.Read32();
+ FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);
+ // dummy len
+
+ // Get the second signature
+ FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
+ FAIL_WITH(wxUINT32_SWAP_ON_BE(signature) != WAVE_SIGNATURE, wxSOUND_INVSTRM);
+ // "WAVE"
+
+ end_headers = FALSE;
+ // Chunk loop
+ while (!end_headers) {
+ FAIL_WITH(m_input->Read(&signature, 4).LastRead() != 4, wxSOUND_INVSTRM);
+
+ len = data.Read32();
+ FAIL_WITH(m_input->LastRead() != 4, wxSOUND_INVSTRM);
+
+ switch (wxUINT32_SWAP_ON_BE(signature)) {
+ case FMT_SIGNATURE: { // "fmt "
+ wxUint16 format, channels, byte_p_spl, bits_p_spl;
+ wxUint32 sample_fq, byte_p_sec;
+
+ // Get the common parameters
+ data >> format >> channels >> sample_fq
+ >> byte_p_sec >> byte_p_spl >> bits_p_spl;
+
+ switch (format) {
+ case 0x01: // PCM
+ if (!HandleOutputPCM(data, channels, sample_fq,
+ byte_p_sec, byte_p_spl, bits_p_spl))
+ return FALSE;
+ break;
+ case 0x40: // G721
+ if (!HandleOutputG721(data, channels, sample_fq,
+ byte_p_sec, byte_p_spl, bits_p_spl))
+ return FALSE;
+ break;
+ default:
+ m_snderror = wxSOUND_NOCODEC;
+ return FALSE;
+ }
+ break;
+ }
+ case DATA_SIGNATURE: // "data"
+ m_base_offset = m_input->TellI();
+ end_headers = TRUE;
+ FinishPreparation(len);
+ break;
+ default:
+ // We pass the chunk
+ m_input->SeekI(len, wxFromCurrent);
+ break;
+ }
+ }
+ return TRUE;
+}
+
+wxSoundFormatBase *wxSoundWave::HandleInputPCM(wxDataOutputStream& data)
+{
+ wxUint16 format, channels, byte_p_spl, bits_p_spl;
+ wxUint32 sample_fq, byte_p_sec;
+ wxSoundFormatPcm *pcm;
+
+ pcm = (wxSoundFormatPcm *)(m_sndformat->Clone());
+
+ // Write block length
+ data.Write32(16);
+
+ sample_fq = pcm->GetSampleRate();
+ bits_p_spl = pcm->GetBPS();
+ channels = pcm->GetChannels();
+ byte_p_spl = pcm->GetBPS() / 8;
+ byte_p_sec = pcm->GetBytesFromTime(1);
+ format = 0x01;
+
+ pcm->Signed(TRUE);
+ pcm->SetOrder(wxLITTLE_ENDIAN);
+
+ data << format << channels << sample_fq
+ << byte_p_sec << byte_p_spl << bits_p_spl;
+
+ return pcm;
+}
+
+wxSoundFormatBase *wxSoundWave::HandleInputG72X(wxDataOutputStream& data)
+{
+ wxUint16 format, channels, byte_p_spl, bits_p_spl;
+ wxUint32 sample_fq, byte_p_sec;
+ wxSoundFormatG72X *g72x;
+
+ // Write block length
+ data.Write32(16);
+
+ g72x = (wxSoundFormatG72X *)(m_sndformat->Clone());
+ if (g72x->GetG72XType() != wxSOUND_G721) {
+ delete g72x;
+ return NULL;
+ }
+
+ sample_fq = g72x->GetSampleRate();
+ bits_p_spl = 4;
+ channels = 1;
+ byte_p_spl = 0;
+ byte_p_sec = g72x->GetBytesFromTime(1);
+ format = 0x40;
+ data << format << channels << sample_fq
+ << byte_p_sec << byte_p_spl << bits_p_spl;
+
+ return g72x;
+}
+
+bool wxSoundWave::PrepareToRecord(wxUint32 time)
+{
+#define WRITE_SIGNATURE(s,sig) \
+signature = sig; \
+signature = wxUINT32_SWAP_ON_BE(signature); \
+FAIL_WITH(s->Write(&signature, 4).LastWrite() != 4, wxSOUND_INVSTRM);
+
+ wxUint32 signature;
+ wxMemoryOutputStream fmt_data;
+
+ if (!m_output) {
+ m_snderror = wxSOUND_INVSTRM;
+ return FALSE;
+ }
+
+ wxDataOutputStream data(*m_output);
+ wxDataOutputStream fmt_d_data(fmt_data);
+
+ data.BigEndianOrdered(FALSE);
+ fmt_d_data.BigEndianOrdered(FALSE);
+
+ WRITE_SIGNATURE(m_output, RIFF_SIGNATURE);
+
+ FAIL_WITH(m_output->LastWrite() != 4, wxSOUND_INVSTRM);
+
+ WRITE_SIGNATURE((&fmt_data), WAVE_SIGNATURE);
+
+ {
+ wxSoundFormatBase *frmt;
+
+ WRITE_SIGNATURE((&fmt_data), FMT_SIGNATURE);
+
+ switch (m_sndformat->GetType()) {
+ case wxSOUND_PCM:
+ frmt = HandleInputPCM(fmt_d_data);
+ break;
+ case wxSOUND_G72X:
+ frmt = HandleInputG72X(fmt_d_data);
+ break;
+ default:
+ m_snderror = wxSOUND_NOCODEC;
+ return FALSE;
+ }
+
+ FAIL_WITH(!frmt, wxSOUND_NOCODEC);
+
+ if (!SetSoundFormat(*frmt)) {
+ delete frmt;
+ return FALSE;
+ }
+
+ delete frmt;
+ }
+
+ data << (fmt_data.GetSize() + m_sndformat->GetBytesFromTime(time));
+
+ // We, finally, copy the header block to the output stream
+ {
+ char *out_buf;
+ out_buf = new char[fmt_data.GetSize()];
+
+ fmt_data.CopyTo(out_buf, fmt_data.GetSize());
+ m_output->Write(out_buf, fmt_data.GetSize());
+
+ delete[] out_buf;
+ }
+
+ WRITE_SIGNATURE(m_output, DATA_SIGNATURE);
+ data.Write32(m_sndformat->GetBytesFromTime(time));
+ return TRUE;
+}
+
+bool wxSoundWave::FinishRecording()
+{
+ if (m_output->SeekO(0, wxFromStart) == wxInvalidOffset)
+ // We can't but there is no error.
+ return TRUE;
+
+ if (m_bytes_left == 0)
+ return TRUE;
+
+ // TODO: Update headers when we stop before the specified time (if possible)
+ return TRUE;
+}
+
+bool wxSoundWave::RepositionStream(wxUint32 position)
+{
+ if (m_base_offset == wxInvalidOffset)
+ return FALSE;
+ m_input->SeekI(m_base_offset, wxFromStart);
+ return TRUE;
+}
+
+wxUint32 wxSoundWave::GetData(void *buffer, wxUint32 len)
+{
+ return m_input->Read(buffer, len).LastRead();
+}
+
+wxUint32 wxSoundWave::PutData(const void *buffer, wxUint32 len)
+{
+ return m_output->Write(buffer, len).LastWrite();
+}
--- /dev/null
+// --------------------------------------------------------------------------
+// Name: sndwin.cpp
+// Purpose:
+// Date: 08/11/1999
+// Author: Guilhem Lavaux <lavaux@easynet.fr> (C) 1999, 2000
+// CVSID: $Id$
+// --------------------------------------------------------------------------
+#ifdef __GNUG__
+#pragma implementation "sndwin.cpp"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifdef __WINDOWS__
+
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+ #include "wx/app.h"
+ #include "wx/module.h"
+ #include "wx/msw/private.h"
+ #include "wx/string.h"
+#endif
+
+// -------------------------------------------------------------------------
+// MMedia headers
+// -------------------------------------------------------------------------
+
+#include "wx/mmedia/sndbase.h"
+#include "wx/mmedia/sndwin.h"
+#include "wx/mmedia/sndpcm.h"
+
+// -------------------------------------------------------------------------
+// System headers
+// -------------------------------------------------------------------------
+
+#include <windows.h>
+#include <mmsystem.h>
+
+// -------------------------------------------------------------------------
+// External definitions, forward, ...
+// -------------------------------------------------------------------------
+
+typedef struct _wxSoundInternal wxSoundInternal;
+typedef struct _wxSoundInfoHeader wxSoundInfoHeader;
+
+extern const wxChar *wxCanvasClassName;
+
+wxList *wxSoundHandleList = NULL;
+
+static inline wxSoundStreamWin *wxFindSoundFromHandle(WXHWND hWnd)
+{
+ wxNode *node = wxSoundHandleList->Find((long)hWnd);
+ if (!node)
+ return NULL;
+ return (wxSoundStreamWin *)node->Data();
+}
+
+struct _wxSoundInternal {
+ HWND m_sndWin;
+ HWAVEIN m_devin;
+ HWAVEOUT m_devout;
+ bool m_output_enabled, m_input_enabled;
+};
+
+struct _wxSoundInfoHeader {
+ HGLOBAL m_h_header, m_h_data;
+ char *m_data;
+ WAVEHDR *m_header;
+ int m_mode;
+ bool m_playing, m_recording;
+ wxUint32 m_position, m_size;
+
+ wxSoundStreamWin *m_driver;
+};
+
+#define WXSOUND_MAX_QUEUE 10
+
+wxSoundStreamWin::wxSoundStreamWin()
+{
+ wxSoundFormatPcm pcm;
+
+ m_production_started = FALSE;
+ m_internal = new wxSoundInternal;
+ if (!m_internal) {
+ m_snderror = wxSOUND_MEMERROR;
+ m_internal = NULL;
+ return;
+ }
+ m_snderror = wxSOUND_NOERROR;
+
+ // Setup defaults
+ CreateSndWindow();
+ SetSoundFormat(pcm);
+
+ m_internal->m_input_enabled = FALSE;
+ m_internal->m_output_enabled = FALSE;
+
+ m_waiting_for = FALSE;
+
+ if (!OpenDevice(wxSOUND_OUTPUT))
+ return;
+
+ CloseDevice();
+}
+
+wxSoundStreamWin::~wxSoundStreamWin()
+{
+ if (m_internal) {
+ if (m_production_started)
+ StopProduction();
+ DestroySndWindow();
+
+ delete m_internal;
+ }
+}
+
+// -----------------------------------------------------------------------
+// _wxSoundHandlerWndProc: Window callback to handle buffer completion
+// -----------------------------------------------------------------------
+LRESULT APIENTRY _EXPORT _wxSoundHandlerWndProc(HWND hWnd, UINT message,
+ WPARAM wParam, LPARAM lParam)
+{
+ wxSoundStreamWin *sndwin;
+
+ sndwin = wxFindSoundFromHandle((WXHWND)hWnd);
+ if (!sndwin)
+ return (LRESULT)0;
+
+ switch (message) {
+ case MM_WOM_DONE:
+ sndwin->NotifyDoneBuffer(wParam, wxSOUND_OUTPUT);
+ break;
+ case MM_WIM_DATA:
+ sndwin->NotifyDoneBuffer(wParam, wxSOUND_INPUT);
+ break;
+ default:
+ break;
+ }
+ return (LRESULT)0;
+}
+
+// -----------------------------------------------------------------------
+// CreateSndWindow() creates an hidden window which will receive the sound
+// events
+// -----------------------------------------------------------------------
+
+void wxSoundStreamWin::CreateSndWindow()
+{
+ FARPROC proc = MakeProcInstance((FARPROC)_wxSoundHandlerWndProc,
+ wxGetInstance());
+ int error;
+
+ m_internal->m_sndWin = ::CreateWindow(wxCanvasClassName, NULL, 0,
+ 0, 0, 0, 0, NULL, (HMENU) NULL,
+ wxGetInstance(), NULL);
+
+ error = GetLastError();
+
+ ::SetWindowLong(m_internal->m_sndWin, GWL_WNDPROC, (LONG)proc);
+
+ // Add this window to the sound handle list so we'll be able to redecode
+ // the "magic" number.
+ wxSoundHandleList->Append((long)m_internal->m_sndWin, (wxObject *)this);
+}
+
+// -----------------------------------------------------------------------
+// DestroySndWindow() destroys the hidden window
+// -----------------------------------------------------------------------
+
+void wxSoundStreamWin::DestroySndWindow()
+{
+ if (m_internal->m_sndWin) {
+ ::DestroyWindow(m_internal->m_sndWin);
+ wxSoundHandleList->DeleteObject((wxObject *)this);
+ }
+}
+
+// -------------------------------------------------------------------------
+// OpenDevice(int mode) initializes the windows driver for a "mode"
+// operation. mode is a bit mask: if the bit "wxSOUND_OUTPUT" is set,
+// the driver is opened for output operation, and if the bit "wxSOUND_INPUT"
+// is set, then the driver is opened for input operation. The two modes
+// aren't exclusive.
+// The initialization parameters (sample rate, ...) are taken from the
+// m_sndformat object.
+// At the end, OpenDevice() calls AllocHeaders() to initialize the Sound IO
+// queue.
+// -------------------------------------------------------------------------
+bool wxSoundStreamWin::OpenDevice(int mode)
+{
+ wxSoundFormatPcm *pcm;
+ WAVEFORMATEX wformat;
+
+ if (!m_sndformat) {
+ m_snderror = wxSOUND_INVFRMT;
+ return FALSE;
+ }
+
+ pcm = (wxSoundFormatPcm *)m_sndformat;
+
+ wformat.wFormatTag = WAVE_FORMAT_PCM;
+ wformat.nChannels = pcm->GetChannels();
+ wformat.nBlockAlign = wformat.nChannels * pcm->GetBPS() / 8;
+ wformat.nSamplesPerSec = pcm->GetSampleRate();
+ wformat.nAvgBytesPerSec = wformat.nSamplesPerSec * wformat.nBlockAlign;
+ wformat.wBitsPerSample = pcm->GetBPS();
+ wformat.cbSize = 0;
+
+ // -----------------------------------
+ // Open the driver for Output operation
+ // -----------------------------------
+ if (mode & wxSOUND_OUTPUT) {
+ MMRESULT result;
+
+ result = waveOutOpen(&m_internal->m_devout,
+ WAVE_MAPPER, &wformat,
+ (DWORD)m_internal->m_sndWin, 0,
+ CALLBACK_WINDOW);
+
+ if (result != MMSYSERR_NOERROR) {
+ m_snderror = wxSOUND_INVDEV;
+ return FALSE;
+ }
+
+ m_output_frag_out = WXSOUND_MAX_QUEUE-1;
+ m_current_frag_out = 0;
+
+ m_internal->m_output_enabled = TRUE;
+ }
+ // -----------------------------------
+ // Open the driver for Input operation
+ // -----------------------------------
+ if (mode & wxSOUND_INPUT) {
+ MMRESULT result;
+
+ result = waveInOpen(&m_internal->m_devin,
+ WAVE_MAPPER, &wformat,
+ (DWORD)m_internal->m_sndWin, 0,
+ CALLBACK_WINDOW);
+
+ if (result != MMSYSERR_NOERROR) {
+ m_snderror = wxSOUND_INVDEV;
+ return FALSE;
+ }
+
+ m_current_frag_in = WXSOUND_MAX_QUEUE-1;
+ m_input_frag_in = 0;
+
+ m_internal->m_input_enabled = TRUE;
+ }
+
+ if (mode & wxSOUND_OUTPUT) {
+ if (!AllocHeaders(wxSOUND_OUTPUT)) {
+ CloseDevice();
+ return FALSE;
+ }
+ }
+ if (mode & wxSOUND_INPUT) {
+ if (!AllocHeaders(wxSOUND_INPUT)) {
+ CloseDevice();
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+// -------------------------------------------------------------------------
+// CloseDevice() closes the driver handles and frees memory allocated for
+// IO queues.
+// -------------------------------------------------------------------------
+void wxSoundStreamWin::CloseDevice()
+{
+ if (m_internal->m_output_enabled) {
+ FreeHeaders(wxSOUND_OUTPUT);
+ m_internal->m_output_enabled = FALSE;
+ waveOutClose(m_internal->m_devout);
+ }
+
+ if (m_internal->m_input_enabled) {
+ FreeHeaders(wxSOUND_INPUT);
+ m_internal->m_input_enabled = FALSE;
+ waveInClose(m_internal->m_devin);
+ }
+}
+
+// -------------------------------------------------------------------------
+// AllocHeader(int mode)
+//
+// mode has the same mean as in OpenDevice() except that here the two flags
+// must be exclusive.
+// AllocHeader() initializes an element of an operation (this can be input
+// or output). It means it allocates the sound header's memory block
+// and "prepares" it (It is needed by Windows). At the same time, it sets
+// private datas so we can the header's owner (See callback).
+//
+// It returns the new allocated block or NULL.
+// -------------------------------------------------------------------------
+wxSoundInfoHeader *wxSoundStreamWin::AllocHeader(int mode)
+{
+ wxSoundInfoHeader *info;
+ WAVEHDR *header;
+
+ // Some memory allocation
+ info = new wxSoundInfoHeader;
+ info->m_h_data = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, GetBestSize());
+ info->m_h_header = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(WAVEHDR));
+ if (!info->m_h_data || !info->m_h_header) {
+ delete info;
+ m_snderror = wxSOUND_MEMERR;
+ return NULL;
+ }
+
+ // Get the two pointers from the system
+ info->m_data = (char *)GlobalLock(info->m_h_data);
+ info->m_header = (WAVEHDR *)GlobalLock(info->m_h_header);
+ // Set the header's mode
+ info->m_mode = mode;
+ // Set the parent of the header
+ info->m_driver = this;
+ // Clean it up
+ ClearHeader(info);
+
+ header = info->m_header;
+ // Initialize Windows variables
+ header->lpData = info->m_data;
+ header->dwBufferLength = GetBestSize();
+ header->dwUser = (DWORD)info;
+ header->dwFlags = WHDR_DONE;
+
+ // "Prepare" the header
+ if (mode == wxSOUND_INPUT) {
+ MMRESULT result;
+
+ result = waveInPrepareHeader(m_internal->m_devin, header,
+ sizeof(WAVEHDR));
+
+ if (result != MMSYSERR_NOERROR) {
+ // If something goes wrong, free everything.
+ GlobalUnlock(info->m_data);
+ GlobalUnlock(info->m_header);
+ GlobalFree(info->m_h_data);
+ GlobalFree(info->m_h_header);
+ delete info;
+
+ m_snderror = wxSOUND_IOERROR;
+ return NULL;
+ }
+ } else if (mode == wxSOUND_OUTPUT) {
+ MMRESULT result;
+
+ result = waveOutPrepareHeader(m_internal->m_devout, header,
+ sizeof(WAVEHDR));
+
+ if (result != MMSYSERR_NOERROR) {
+ // If something goes wrong, free everything.
+ GlobalUnlock(info->m_data);
+ GlobalUnlock(info->m_header);
+ GlobalFree(info->m_h_data);
+ GlobalFree(info->m_h_header);
+ delete info;
+
+ m_snderror = wxSOUND_IOERROR;
+ return NULL;
+ }
+ }
+ return info;
+}
+
+// -------------------------------------------------------------------------
+// AllocHeaders(int mode)
+//
+// "mode" has the same mean as for OpenDevice() except that the two flags must
+// be exclusive.
+// AllocHeaders() allocates WXSOUND_MAX_QUEUE (= 128) blocks for an operation
+// queue. It uses AllocHeader() for each element.
+//
+// Once it has allocated all blocks, it returns TRUE and if an error occured
+// it returns FALSE.
+// -------------------------------------------------------------------------
+bool wxSoundStreamWin::AllocHeaders(int mode)
+{
+ int i;
+ wxSoundInfoHeader **headers;
+
+ if (mode == wxSOUND_OUTPUT)
+ headers = m_headers_play = new wxSoundInfoHeader *[WXSOUND_MAX_QUEUE];
+ else
+ headers = m_headers_rec = new wxSoundInfoHeader *[WXSOUND_MAX_QUEUE];
+
+ memset(headers, 0, WXSOUND_MAX_QUEUE*sizeof(wxSoundInfoHeader *));
+
+ for (i=0;i<WXSOUND_MAX_QUEUE;i++) {
+ headers[i] = AllocHeader(mode);
+ if (!headers[i]) {
+ FreeHeaders(mode);
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+// -------------------------------------------------------------------------
+// FreeHeader(int mode)
+//
+// "mode" has the same mean as for OpenDevice() except that the two flags must
+// be exclusive.
+// FreeHeader() frees a memory block and "unprepares" it.
+// -------------------------------------------------------------------------
+void wxSoundStreamWin::FreeHeader(wxSoundInfoHeader *header, int mode)
+{
+ if (mode == wxSOUND_OUTPUT)
+ waveOutUnprepareHeader(m_internal->m_devout, header->m_header, sizeof(WAVEHDR));
+ else
+ waveInUnprepareHeader(m_internal->m_devin, header->m_header, sizeof(WAVEHDR));
+
+ GlobalUnlock(header->m_data);
+ GlobalUnlock(header->m_header);
+ GlobalFree(header->m_h_header);
+ GlobalFree(header->m_h_data);
+ delete header;
+}
+
+// -------------------------------------------------------------------------
+// FreeHeaders(int mode)
+//
+// "mode" has the same mean as for OpenDevice() except that the two flags must
+// be exclusive.
+// FreeHeaders() frees all an operation queue once it has checked that
+// all buffers have been terminated.
+// -------------------------------------------------------------------------
+void wxSoundStreamWin::FreeHeaders(int mode)
+{
+ int i;
+ wxSoundInfoHeader ***headers;
+
+ if (mode == wxSOUND_OUTPUT)
+ headers = &m_headers_play;
+ else
+ headers = &m_headers_rec;
+
+ for (i=0;i<WXSOUND_MAX_QUEUE;i++) {
+ if ((*headers)[i]) {
+ // We wait for the end of the buffer
+ WaitFor((*headers)[i]);
+ // Then, we free the header
+ FreeHeader((*headers)[i], mode);
+ }
+ }
+ delete[] (*headers);
+ (*headers) = NULL;
+}
+
+// -------------------------------------------------------------------------
+// WaitFor(wxSoundInfoHeader *info)
+//
+// "info" is one element of an IO queue
+// WaitFor() checks whether the specified block has been terminated.
+// If it hasn't been terminated, it waits for its termination.
+//
+// NB: if it's a partially filled buffer it adds it to the Windows queue
+// -------------------------------------------------------------------------
+void wxSoundStreamWin::WaitFor(wxSoundInfoHeader *info)
+{
+ // If the buffer is finished, we return immediately
+ if (!info->m_playing) {
+
+ // We begun filling it: we must send it to the Windows queue
+ if (info->m_position != 0) {
+ memset(info->m_data + info->m_position, 0, info->m_size);
+ AddToQueue(info);
+ }
+ }
+
+ if (m_waiting_for) {
+ // PROBLEM //
+ return;
+ }
+ m_waiting_for = TRUE;
+ // Else, we wait for its termination
+ while (info->m_playing || info->m_recording)
+ wxYield();
+ m_waiting_for = FALSE;
+}
+
+// -------------------------------------------------------------------------
+// AddToQueue(wxSoundInfoHeader *info)
+//
+// For "info", see WaitFor()
+// AddToQueue() sends the IO queue element to the Windows queue.
+//
+// Warning: in the current implementation, it partially assume we send the
+// element in the right order. This is true in that implementation but if
+// you use it elsewhere, be careful: it may shuffle all your sound datas.
+// -------------------------------------------------------------------------
+bool wxSoundStreamWin::AddToQueue(wxSoundInfoHeader *info)
+{
+ MMRESULT result;
+
+ if (info->m_mode == wxSOUND_INPUT) {
+ // Increment the input fragment pointer
+ result = waveInAddBuffer(m_internal->m_devin,
+ info->m_header, sizeof(WAVEHDR));
+ if (result == MMSYSERR_NOERROR)
+ info->m_recording = TRUE;
+ else
+ return FALSE;
+ } else if (info->m_mode == wxSOUND_OUTPUT) {
+ result = waveOutWrite(m_internal->m_devout,
+ info->m_header, sizeof(WAVEHDR));
+ if (result == MMSYSERR_NOERROR)
+ info->m_playing = TRUE;
+ else
+ return FALSE;
+ }
+ return TRUE;
+}
+
+// -------------------------------------------------------------------------
+// ClearHeader(wxSoundInfoHeader *info)
+//
+// ClearHeader() reinitializes the parameters of "info" to their default
+// value.
+// -------------------------------------------------------------------------
+void wxSoundStreamWin::ClearHeader(wxSoundInfoHeader *info)
+{
+ info->m_playing = FALSE;
+ info->m_recording = FALSE;
+ info->m_position = 0;
+ info->m_size = GetBestSize();
+}
+
+// -------------------------------------------------------------------------
+// wxSoundInfoHeader *NextFragmentOutput()
+//
+// NextFragmentOutput() looks for a free output block. It will always
+// return you a non-NULL pointer but it may waits for an empty buffer a long
+// time.
+// -------------------------------------------------------------------------
+wxSoundInfoHeader *wxSoundStreamWin::NextFragmentOutput()
+{
+ if (m_headers_play[m_current_frag_out]->m_playing) {
+ m_current_frag_out = (m_current_frag_out + 1) % WXSOUND_MAX_QUEUE;
+
+ if (m_headers_play[m_current_frag_out]->m_playing)
+ WaitFor(m_headers_play[m_current_frag_out]);
+ }
+ if (m_current_frag_out == m_output_frag_out)
+ m_queue_filled = TRUE;
+ return m_headers_play[m_current_frag_out];
+}
+
+// -------------------------------------------------------------------------
+// The behaviour of Write is documented in the global documentation.
+// -------------------------------------------------------------------------
+wxSoundStream& wxSoundStreamWin::Write(const void *buffer, wxUint32 len)
+{
+ m_lastcount = 0;
+ if (!m_internal->m_output_enabled) {
+ m_snderror = wxSOUND_NOTSTARTED;
+ return *this;
+ }
+
+
+ while (len > 0) {
+ wxSoundInfoHeader *header;
+ wxUint32 to_copy;
+
+ // Get a new output fragment
+ header = NextFragmentOutput();
+
+ to_copy = (len > header->m_size) ? header->m_size : len;
+ memcpy(header->m_data + header->m_position, buffer, to_copy);
+
+ header->m_position += to_copy;
+ header->m_size -= to_copy;
+ buffer = (((const char *)buffer) + to_copy);
+ len -= to_copy;
+ m_lastcount += to_copy;
+
+ // If the fragment is full, we send it to the Windows queue.
+ if (header->m_size == 0)
+ if (!AddToQueue(header)) {
+ m_snderror = wxSOUND_IOERROR;
+ return *this;
+ }
+ }
+ return *this;
+}
+
+// -------------------------------------------------------------------------
+// NextFragmentInput is not functional.
+// -------------------------------------------------------------------------
+wxSoundInfoHeader *wxSoundStreamWin::NextFragmentInput()
+{
+ wxSoundInfoHeader *header;
+
+ // Queue pointer: reader
+ m_current_frag_in = (m_current_frag_in + 1) % WXSOUND_MAX_QUEUE;
+
+ header = m_headers_rec[m_current_frag_in];
+ // If the current buffer is in recording mode, we must wait for its
+ // completion.
+ if (header->m_recording)
+ WaitFor(header);
+
+ // We reached the writer position: the queue is full.
+ if (m_current_frag_in == m_input_frag_in)
+ m_queue_filled = TRUE;
+
+ return header;
+}
+
+// -------------------------------------------------------------------------
+// The behaviour of Read is documented in the global documentation.
+// -------------------------------------------------------------------------
+wxSoundStream& wxSoundStreamWin::Read(void *buffer, wxUint32 len)
+{
+ wxSoundInfoHeader *header;
+ wxUint32 to_copy;
+
+ m_lastcount = 0;
+ if (!m_internal->m_input_enabled)
+ return *this;
+
+ while (len > 0) {
+ header = NextFragmentInput();
+
+ to_copy = (len > header->m_size) ? header->m_size : len;
+ memcpy(buffer, header->m_data + header->m_position, to_copy);
+
+ header->m_position += to_copy;
+ header->m_size -= to_copy;
+ buffer = (((char *)buffer) + to_copy);
+ len -= to_copy;
+ m_lastcount += to_copy;
+
+ if (header->m_size == 0) {
+ ClearHeader(header);
+ if (!AddToQueue(header)) {
+ m_snderror = wxSOUND_IOERROR;
+ return *this;
+ }
+ }
+ }
+ return *this;
+}
+
+// -------------------------------------------------------------------------
+// NotifyDoneBuffer(wxUint32 dev_handle)
+//
+// NotifyDoneBuffer() is called by wxSoundHandlerProc each time a sound
+// fragment finished. It reinitializes the parameters of the fragment and
+// sends an event to the clients.
+// -------------------------------------------------------------------------
+void wxSoundStreamWin::NotifyDoneBuffer(wxUint32 dev_handle, int flag)
+{
+ wxSoundInfoHeader *info;
+
+ if (flag == wxSOUND_OUTPUT) {
+ if (!m_internal->m_output_enabled)
+ return;
+
+ // Queue pointer: reader
+ m_output_frag_out = (m_output_frag_out + 1) % WXSOUND_MAX_QUEUE;
+ info = m_headers_play[m_output_frag_out];
+ // Clear header to tell the system the buffer is free now
+ ClearHeader(info);
+ m_queue_filled = FALSE;
+ if (!m_waiting_for)
+ // Try to requeue a new buffer.
+ OnSoundEvent(wxSOUND_OUTPUT);
+ } else {
+ if (!m_internal->m_input_enabled)
+ return;
+
+ // Recording completed
+ m_headers_rec[m_input_frag_in]->m_recording = FALSE;
+ // Queue pointer: writer
+ m_input_frag_in = (m_input_frag_in + 1) % WXSOUND_MAX_QUEUE;
+ if (!m_waiting_for)
+ OnSoundEvent(wxSOUND_INPUT);
+ m_queue_filled = FALSE;
+ }
+}
+
+// -------------------------------------------------------------------------
+// SetSoundFormat()
+// -------------------------------------------------------------------------
+bool wxSoundStreamWin::SetSoundFormat(wxSoundFormatBase& base)
+{
+ // TODO: detect best format
+ return wxSoundStream::SetSoundFormat(base);
+}
+
+// -------------------------------------------------------------------------
+// StartProduction()
+// -------------------------------------------------------------------------
+bool wxSoundStreamWin::StartProduction(int evt)
+{
+ if (!m_internal)
+ return FALSE;
+
+ if ((m_internal->m_output_enabled && (evt & wxSOUND_OUTPUT)) ||
+ (m_internal->m_input_enabled && (evt & wxSOUND_INPUT)))
+ CloseDevice();
+
+ if (!OpenDevice(evt))
+ return FALSE;
+
+ m_production_started = TRUE;
+ m_queue_filled = FALSE;
+ // Send a dummy event to start.
+ if (evt & wxSOUND_OUTPUT)
+ OnSoundEvent(wxSOUND_OUTPUT);
+
+ if (evt & wxSOUND_INPUT) {
+ int i;
+ for (i=0;i<WXSOUND_MAX_QUEUE;i++)
+ AddToQueue(m_headers_rec[i]);
+
+ waveInStart(m_internal->m_devin);
+ }
+
+ return TRUE;
+}
+
+// -------------------------------------------------------------------------
+// StopProduction()
+// ------------------------------------------------------------------------
+bool wxSoundStreamWin::StopProduction()
+{
+ if (!m_production_started) {
+ m_snderror = wxSOUND_NOTSTARTED;
+ return FALSE;
+ }
+
+ m_snderror = wxSOUND_NOERROR;
+ m_production_started = FALSE;
+ CloseDevice();
+ return TRUE;
+}
+
+// -------------------------------------------------------------------------
+// QueueFilled()
+// -------------------------------------------------------------------------
+bool wxSoundStreamWin::QueueFilled() const
+{
+ return (!m_production_started || m_queue_filled);
+}
+
+
+// --------------------------------------------------------------------------
+// wxSoundWinModule
+// --------------------------------------------------------------------------
+
+class WXDLLEXPORT wxSoundWinModule : public wxModule {
+ DECLARE_DYNAMIC_CLASS(wxSoundWinModule)
+ public:
+ bool OnInit();
+ void OnExit();
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxSoundWinModule, wxModule)
+
+bool wxSoundWinModule::OnInit() {
+ wxSoundHandleList = new wxList(wxKEY_INTEGER);
+ return TRUE;
+}
+
+void wxSoundWinModule::OnExit() {
+ delete wxSoundHandleList;
+}
+
+#endif
+ // __WINDOWS__
--- /dev/null
+////////////////////////////////////////////////////////////////////////////////
+// Name: vidbdrv.cpp
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: 1997
+// Updated: 1998
+// Copyright: (C) 1997, 1998, Guilhem Lavaux
+// License: wxWindows license
+////////////////////////////////////////////////////////////////////////////////
+#ifdef __GNUG__
+#pragma implementation "vidbase.h"
+#endif
+
+#include <wx/wxprec.h>
+
+#ifndef WX_PRECOMP
+#include <wx/stream.h>
+#include <wx/wfstream.h>
+#endif
+
+#include "wx/mmedia/vidbase.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+IMPLEMENT_ABSTRACT_CLASS(wxVideoBaseDriver, wxObject)
+
+///
+wxVideoBaseDriver::wxVideoBaseDriver()
+{
+ m_video_output = NULL;
+}
+
+wxVideoBaseDriver::wxVideoBaseDriver(wxInputStream& str)
+{
+ m_video_output = NULL;
+}
+
+wxVideoBaseDriver::wxVideoBaseDriver(const wxString& filename)
+{
+ m_video_output = NULL;
+}
+
+wxVideoBaseDriver::~wxVideoBaseDriver()
+{
+}
+
+bool wxVideoBaseDriver::AttachOutput(wxWindow& output)
+{
+ m_video_output = &output;
+ return TRUE;
+}
+
+void wxVideoBaseDriver::DetachOutput()
+{
+ m_video_output = NULL;
+}
+
+// Use an external frame for video output
+
+wxFrame *wxVideoCreateFrame(wxVideoBaseDriver *vid_drv)
+{
+ wxFrame *frame = new wxFrame(NULL, -1, "Video Output", wxDefaultPosition, wxSize(100, 100));
+ wxWindow *vid_out = new wxWindow(frame, -1, wxPoint(0, 0), wxSize(300, 300));
+
+ frame->Layout();
+ frame->Show(TRUE);
+
+ vid_drv->AttachOutput(*vid_out);
+ vid_drv->Play();
+
+ return frame;
+}
--- /dev/null
+// -----------------------------------------------------------------------------
+// Name: vidwin.h
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: February 1998
+// Updated:
+// Copyright: (C) 1998, 1999, 2000 Guilhem Lavaux
+// License: wxWindows license
+// -----------------------------------------------------------------------------
+
+#ifdef __GNUG__
+#pragma implementation "vidwin.h"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#ifdef __WINDOWS__
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif
+
+#include "wx/stream.h"
+#include "wx/wfstream.h"
+
+#define WXMMEDIA_INTERNAL
+#include <windows.h>
+#include <mmsystem.h>
+#include <digitalv.h>
+#include "wx/mmedia/vidwin.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+IMPLEMENT_DYNAMIC_CLASS(wxVideoWindows, wxVideoBaseDriver)
+
+wxVideoWindows::wxVideoWindows()
+{
+}
+
+wxVideoWindows::wxVideoWindows(wxInputStream& str)
+ : wxVideoBaseDriver(str)
+{
+ m_internal = new wxVIDWinternal;
+ m_remove_file = TRUE;
+ m_filename = wxGetTempFileName("wxvid");
+ m_paused = FALSE;
+ m_stopped = TRUE;
+ m_frameRate = 1.0;
+
+ wxFileOutputStream temp_file(m_filename);
+ temp_file << str;
+
+ OpenFile();
+}
+
+wxVideoWindows::wxVideoWindows(const wxString& filename)
+ : wxVideoBaseDriver(filename)
+{
+ m_internal = new wxVIDWinternal;
+ m_remove_file = FALSE;
+ m_filename = filename;
+ m_paused = FALSE;
+ m_stopped = TRUE;
+ m_frameRate = 1.0;
+ OpenFile();
+}
+
+wxVideoWindows::~wxVideoWindows(void)
+{
+ mciSendCommand(m_internal->m_dev_id, MCI_CLOSE, 0, 0);
+
+ if (m_internal)
+ delete m_internal;
+}
+
+void wxVideoWindows::OpenFile()
+{
+ MCI_DGV_OPEN_PARMS openStruct;
+ MCI_DGV_SET_PARMS setStruct;
+ MCI_STATUS_PARMS statusStruct;
+ DWORD ret;
+
+ openStruct.lpstrDeviceType = "avivideo";
+ openStruct.lpstrElementName = (LPSTR)(m_filename.mb_str());
+ openStruct.hWndParent = 0;
+
+ ret = mciSendCommand(0, MCI_OPEN,
+ MCI_OPEN_ELEMENT|MCI_DGV_OPEN_PARENT|MCI_OPEN_TYPE|MCI_DGV_OPEN_32BIT,
+ (DWORD)(LPVOID)&openStruct);
+ m_internal->m_dev_id = openStruct.wDeviceID;
+
+
+ setStruct.dwCallback = 0;
+ setStruct.dwTimeFormat = MCI_FORMAT_FRAMES;
+
+ ret = mciSendCommand(m_internal->m_dev_id, MCI_SET, MCI_SET_TIME_FORMAT,
+ (DWORD)(LPVOID)&setStruct);
+
+
+ statusStruct.dwCallback = 0;
+ statusStruct.dwItem = MCI_DGV_STATUS_FRAME_RATE;
+ ret = mciSendCommand(m_internal->m_dev_id, MCI_STATUS,
+ MCI_STATUS_ITEM,
+ (DWORD)(LPVOID)&statusStruct);
+
+ m_frameRate = ((double)statusStruct.dwReturn) / 1000;
+
+ statusStruct.dwItem = MCI_DGV_STATUS_BITSPERSAMPLE;
+ ret = mciSendCommand(m_internal->m_dev_id, MCI_STATUS, MCI_STATUS_ITEM,
+ (DWORD)(LPVOID)&statusStruct);
+ m_bps = statusStruct.dwReturn;
+
+}
+
+bool wxVideoWindows::Pause()
+{
+ if (m_paused || m_stopped)
+ return TRUE;
+ m_paused = TRUE;
+ return (mciSendCommand(m_internal->m_dev_id, MCI_PAUSE, MCI_WAIT, 0) == 0);
+}
+
+bool wxVideoWindows::Resume()
+{
+ if (!m_paused || m_stopped)
+ return TRUE;
+ m_paused = FALSE;
+ return (mciSendCommand(m_internal->m_dev_id, MCI_RESUME, 0, 0) == 0);
+}
+
+bool wxVideoWindows::IsPaused() const
+{
+ return m_paused;
+}
+
+bool wxVideoWindows::IsStopped() const
+{
+ return m_stopped;
+}
+
+bool wxVideoWindows::GetSize(wxSize& size) const
+{
+ size.SetWidth(200);
+ size.SetHeight(200);
+ return TRUE;
+}
+
+bool wxVideoWindows::SetSize(wxSize size)
+{
+ return TRUE;
+}
+
+bool wxVideoWindows::IsCapable(wxVideoType v_type)
+{
+ return (v_type == wxVIDEO_MSAVI);
+}
+
+bool wxVideoWindows::AttachOutput(wxWindow& output)
+{
+ MCI_DGV_WINDOW_PARMS win_struct;
+
+ if (!wxVideoBaseDriver::AttachOutput(output))
+ return FALSE;
+
+ win_struct.hWnd = (HWND)output.GetHWND();
+ mciSendCommand(m_internal->m_dev_id, MCI_WINDOW,
+ MCI_DGV_WINDOW_HWND, (DWORD)(LPVOID)&win_struct);
+ return TRUE;
+}
+
+void wxVideoWindows::DetachOutput()
+{
+ MCI_DGV_WINDOW_PARMS win_struct;
+
+ wxVideoBaseDriver::DetachOutput();
+
+ win_struct.hWnd = 0;
+ mciSendCommand(m_internal->m_dev_id, MCI_WINDOW,
+ MCI_DGV_WINDOW_HWND, (DWORD)(LPVOID)&win_struct);
+}
+
+bool wxVideoWindows::Play()
+{
+ if (!m_stopped)
+ return FALSE;
+ m_stopped = FALSE;
+ return (mciSendCommand(m_internal->m_dev_id, MCI_PLAY, 0, NULL) == 0);
+}
+
+bool wxVideoWindows::Stop()
+{
+ MCI_SEEK_PARMS seekStruct;
+
+ if (m_stopped)
+ return FALSE;
+ m_stopped = TRUE;
+ if (::mciSendCommand(m_internal->m_dev_id, MCI_STOP, MCI_WAIT, NULL) != 0)
+ return FALSE;
+
+ seekStruct.dwCallback = 0;
+ seekStruct.dwTo = 0;
+ return (::mciSendCommand(m_internal->m_dev_id, MCI_SEEK, MCI_SEEK_TO_START|MCI_WAIT, (DWORD)(LPVOID)&seekStruct) == 0);
+}
+
+// TODO TODO
+// I hate windows :-(. The doc says MCI_STATUS should return all info I want but when I call it
+// it returns to me with an UNSUPPORTED_FUNCTION error. I will have to do all by myself. Grrrr !
+
+wxString wxVideoWindows::GetMovieCodec() const
+{
+ return wxT("No info");
+}
+
+wxString wxVideoWindows::GetAudioCodec() const
+{
+ return wxT("No info");
+}
+
+wxUint32 wxVideoWindows::GetSampleRate() const
+{
+ return 22500;
+}
+
+wxUint8 wxVideoWindows::GetChannels() const
+{
+ return 1;
+}
+
+wxUint8 wxVideoWindows::GetBPS() const
+{
+ return m_bps;
+}
+
+double wxVideoWindows::GetFrameRate() const
+{
+ return m_frameRate;
+}
+
+wxUint32 wxVideoWindows::GetNbFrames() const
+{
+ return 0;
+}
+
+#endif
+ // __WINDOWS__
--- /dev/null
+// -------------------------------------------------------------------------
+// Name: vidxanm.cpp
+// Purpose: wxMMedia
+// Author: Guilhem Lavaux
+// Created: 1997
+// Updated: 1998
+// Copyright: (C) 1997, 1998, 1999 Guilhem Lavaux
+// License: wxWindows license
+// -------------------------------------------------------------------------
+
+#ifdef __GNUG__
+#pragma implementation "vidxanm.h"
+#endif
+
+#include <wx/wxprec.h>
+
+#ifndef WX_PRECOMP
+#include <wx/wx.h>
+#endif
+
+// Pizza !
+#include <wx/gtk/win_gtk.h>
+
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+#ifdef __WXGTK__
+#include <gtk/gtkwidget.h>
+#include <gtk/gtkwindow.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkprivate.h>
+#endif
+
+#include <wx/filefn.h>
+#include <wx/wfstream.h>
+#include <wx/datstrm.h>
+#include <wx/tokenzr.h>
+
+#define WXMMEDIA_INTERNAL
+#include "wx/mmedia/vidbase.h"
+#include "wx/mmedia/vidxanm.h"
+
+IMPLEMENT_DYNAMIC_CLASS(wxVideoXANIM, wxVideoBaseDriver)
+
+// -------------------------------------------------------------------------
+// End process detector
+
+class wxVideoXANIMProcess: public wxProcess {
+public:
+ wxVideoXANIMProcess(wxVideoXANIM *xanim);
+
+ void OnTerminate(int pid, int status);
+
+protected:
+ wxVideoXANIM *m_vid_xanim;
+};
+
+class wxVideoXANIMOutput: public wxProcess {
+public:
+ wxVideoXANIMOutput();
+
+ void OnTerminate(int pid, int status);
+
+ bool IsTerminated() const;
+protected:
+ bool m_terminated;
+};
+
+// -------------------------------------------------------------------------
+// XAnim video driver (process handling implementation)
+
+wxVideoXANIMProcess::wxVideoXANIMProcess(wxVideoXANIM *xanim)
+{
+ m_vid_xanim = xanim;
+}
+
+void wxVideoXANIMProcess::OnTerminate(int WXUNUSED(pid), int WXUNUSED(status))
+{
+ m_vid_xanim->m_xanim_started = FALSE;
+ m_vid_xanim->OnFinished();
+}
+
+wxVideoXANIMOutput::wxVideoXANIMOutput()
+ : wxProcess(NULL, -1)
+{
+ m_terminated = FALSE;
+ Redirect();
+}
+
+bool wxVideoXANIMOutput::IsTerminated() const
+{
+ return m_terminated;
+}
+
+void wxVideoXANIMOutput::OnTerminate(int pid, int status)
+{
+ m_terminated = TRUE;
+}
+
+// -------------------------------------------------------------------------
+// XAnim video driver (implementation)
+
+wxVideoXANIM::wxVideoXANIM()
+ : wxVideoBaseDriver()
+{
+ m_internal = new wxXANIMinternal;
+ m_xanim_detector = new wxVideoXANIMProcess(this);
+ m_xanim_started = FALSE;
+ m_paused = FALSE;
+ m_filename = "";
+ m_remove_file = FALSE;
+}
+
+wxVideoXANIM::wxVideoXANIM(wxInputStream& str)
+ : wxVideoBaseDriver(str)
+{
+ m_internal = new wxXANIMinternal;
+ m_xanim_detector = new wxVideoXANIMProcess(this);
+ m_xanim_started = FALSE;
+ m_paused = FALSE;
+ m_size[0] = 0;
+ m_size[1] = 0;
+
+ m_filename = wxGetTempFileName("vidxa");
+ m_remove_file = TRUE;
+ wxFileOutputStream fout(m_filename);
+
+ fout << str;
+
+ CollectInfo();
+}
+
+wxVideoXANIM::wxVideoXANIM(const wxString& filename)
+{
+ m_internal = new wxXANIMinternal;
+ m_xanim_detector = new wxVideoXANIMProcess(this);
+ m_xanim_started = FALSE;
+ m_paused = FALSE;
+
+ m_filename = filename;
+ m_remove_file = FALSE;
+ m_size[0] = 0;
+ m_size[1] = 0;
+
+ CollectInfo();
+}
+
+wxVideoXANIM::~wxVideoXANIM()
+{
+ if (m_xanim_started)
+ Stop();
+ delete m_internal;
+ delete m_xanim_detector;
+
+ if (m_remove_file)
+ wxRemoveFile(m_filename);
+}
+
+// -------------------------------------------------------------------------
+// Movie controller
+
+bool wxVideoXANIM::Play()
+{
+ if (!m_paused && m_xanim_started)
+ return TRUE;
+ if (!m_video_output) {
+ wxVideoCreateFrame(this);
+ return TRUE;
+ }
+
+ // The movie starts with xanim
+ if (RestartXANIM()) {
+ m_paused = FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool wxVideoXANIM::Pause()
+{
+ if (!m_paused && SendCommand(" ")) {
+ m_paused = TRUE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool wxVideoXANIM::Resume()
+{
+ if (m_paused && SendCommand(" ")) {
+ m_paused = FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool wxVideoXANIM::Stop()
+{
+ if (!m_xanim_started)
+ return FALSE;
+
+ SendCommand("q");
+
+ // We are waiting for the termination of the subprocess.
+ while (m_xanim_started) {
+ wxYield();
+ }
+
+ m_paused = FALSE;
+
+ return TRUE;
+}
+
+// -------------------------------------------------------------------------
+// Movie size controller
+
+bool wxVideoXANIM::SetSize(wxSize size)
+{
+ if (!m_video_output)
+ return FALSE;
+
+ m_video_output->SetSize(size.GetWidth(), size.GetHeight());
+ return FALSE;
+}
+
+bool wxVideoXANIM::GetSize(wxSize& size) const
+{
+ if (m_size[0] == 0)
+ return FALSE;
+ size.Set(m_size[0], m_size[1]);
+ return TRUE;
+}
+
+// -------------------------------------------------------------------------
+// Capabilities of XAnim
+
+bool wxVideoXANIM::IsCapable(wxVideoType v_type) const
+{
+ if (v_type == wxVIDEO_MSAVI || v_type == wxVIDEO_MPEG ||
+ v_type == wxVIDEO_QT || v_type == wxVIDEO_GIF || v_type == wxVIDEO_JMOV ||
+ v_type == wxVIDEO_FLI || v_type == wxVIDEO_IFF || v_type == wxVIDEO_SGI)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+// -------------------------------------------------------------------------
+// Movie state
+
+wxString wxVideoXANIM::GetMovieCodec() const
+{
+ if (m_size[0] == 0)
+ return wxT("");
+ return m_movieCodec;
+}
+
+wxString wxVideoXANIM::GetAudioCodec() const
+{
+ if (m_size[0] == 0)
+ return wxT("");
+ return m_audioCodec;
+}
+
+wxUint32 wxVideoXANIM::GetSampleRate() const
+{
+ if (m_size[0] == 0)
+ return 0;
+ return m_sampleRate;
+}
+
+wxUint8 wxVideoXANIM::GetChannels() const
+{
+ if (m_size[0] == 0)
+ return 0;
+ return m_channels;
+}
+
+wxUint8 wxVideoXANIM::GetBPS() const
+{
+ if (m_size[0] == 0)
+ return 0;
+ return m_bps;
+}
+
+double wxVideoXANIM::GetFrameRate() const
+{
+ if (m_size[0] == 0)
+ return 0.0;
+ return m_frameRate;
+}
+
+wxUint32 wxVideoXANIM::GetNbFrames() const
+{
+ if (m_size[0] == 0)
+ return 0;
+ return m_frames;
+}
+
+
+bool wxVideoXANIM::IsPaused() const
+{
+ return m_paused;
+}
+
+bool wxVideoXANIM::IsStopped() const
+{
+ return !m_xanim_started;
+}
+
+// -------------------------------------------------------------------------
+// Output management
+
+bool wxVideoXANIM::AttachOutput(wxWindow& out)
+{
+ if (!wxVideoBaseDriver::AttachOutput(out))
+ return FALSE;
+
+ return TRUE;
+}
+
+void wxVideoXANIM::DetachOutput()
+{
+ SendCommand("q");
+ m_xanim_started = FALSE;
+ m_paused = FALSE;
+
+ wxVideoBaseDriver::DetachOutput();
+}
+
+// -------------------------------------------------------------------------
+// Lowlevel XAnim controller
+
+bool wxVideoXANIM::SendCommand(const char *command, char **ret,
+ wxUint32 *size)
+{
+ if (!m_xanim_started)
+ if (!RestartXANIM())
+ return FALSE;
+
+ // Send a command to XAnim through X11 Property
+ XChangeProperty(m_internal->xanim_dpy, m_internal->xanim_window,
+ m_internal->xanim_atom,
+ XA_STRING, 8, PropModeReplace, (unsigned char *)command,
+ strlen(command));
+ XFlush(m_internal->xanim_dpy);
+ if (ret) {
+ int prop_format;
+ Atom prop_type;
+ unsigned long extra;
+
+ XGetWindowProperty(m_internal->xanim_dpy, m_internal->xanim_window,
+ m_internal->xanim_ret, 0, 16, True, AnyPropertyType,
+ &prop_type, &prop_format, (unsigned long *)size,
+ &extra, (unsigned char **)ret);
+ }
+ return TRUE;
+}
+
+bool wxVideoXANIM::CollectInfo()
+{
+ wxVideoXANIMOutput *xanimProcess;
+ wxString xanim_command;
+ wxStringTokenizer tokenizer;
+
+ xanimProcess = new wxVideoXANIMOutput;
+ xanim_command = wxT("xanim +v +Zv -Ae ");
+ xanim_command += m_filename;
+ if (!wxExecute(xanim_command, FALSE, xanimProcess))
+ return FALSE;
+
+ wxInputStream *infoStream = xanimProcess->GetInputStream();
+ wxString totalOutput;
+
+ while (infoStream->LastError() == wxSTREAM_NOERROR) {
+ char line[100];
+
+ infoStream->Read(line, sizeof(line)-1);
+ if (infoStream->LastRead() == 0)
+ break;
+
+ line[infoStream->LastRead()] = 0;
+
+ totalOutput += line;
+ }
+
+ // This is good for everything ... :-)
+ int position = totalOutput.Find(wxT("Video Codec:"));
+
+ totalOutput.Remove(0, position+13);
+
+ position = totalOutput.Find(wxT("depth="));
+ m_movieCodec = totalOutput(0, position);
+
+ totalOutput.Remove(0, position);
+ tokenizer.SetString(totalOutput, "\n\r");
+
+ // the rest of the line
+ wxString token = tokenizer.GetNextToken();
+ unsigned long my_long;
+
+#define GETINT(i) \
+totalOutput.ToULong(&my_long); \
+i = my_long;
+
+ // 'Audio Codec:'
+ totalOutput = tokenizer.GetString();
+ totalOutput.Remove(0, totalOutput.Find(wxT(":"))+2);
+
+ position = totalOutput.Find(wxT("Rate"));
+ m_audioCodec = totalOutput(0, position-1);
+
+ // 'Rate='
+ totalOutput.Remove(0, totalOutput.Find(wxT("="))+1);
+ GETINT(m_sampleRate);
+ // 'Chans='
+ totalOutput.Remove(0, totalOutput.Find(wxT("="))+1);
+ GETINT(m_channels);
+ // 'Bps='
+ totalOutput.Remove(0, totalOutput.Find(wxT("="))+1);
+ GETINT(m_bps);
+ // 'Frame Stats:'
+ tokenizer.Reinit(totalOutput);
+ tokenizer.GetNextToken();
+ totalOutput = tokenizer.GetString();
+ totalOutput.Remove(0, totalOutput.Find(wxT(":"))+2);
+ // 'Size='
+ totalOutput.Remove(0, totalOutput.Find(wxT("="))+1);
+ GETINT(m_size[0]);
+ // 'x'
+ totalOutput.Remove(0,1);
+ GETINT(m_size[1]);
+ // 'Frames='
+ totalOutput.Remove(0, totalOutput.Find(wxT("="))+1);
+ GETINT(m_frames);
+ // 'avfps='
+ totalOutput.Remove(0, totalOutput.Find(wxT("="))+1);
+ totalOutput.ToDouble(&m_frameRate);
+
+ // We wait for the conclusion
+ while (!xanimProcess->IsTerminated())
+ wxYield();
+
+ delete xanimProcess;
+
+ return TRUE;
+}
+
+bool wxVideoXANIM::RestartXANIM()
+{
+ wxString xanim_command;
+ int ret;
+ Atom prop_type;
+ int prop_format;
+ unsigned long nitems;
+ unsigned long extra;
+ char prop[4];
+ bool xanim_chg_size;
+
+ if (!m_video_output || m_xanim_started)
+ return FALSE;
+
+ // Check if we can change the size of the window dynamicly
+ xanim_chg_size = TRUE;
+ // Get current display
+#ifdef __WXGTK__
+ m_internal->xanim_dpy = gdk_display;
+ GtkPizza *pizza = GTK_PIZZA( m_video_output->m_wxwindow );
+ GdkWindow *window = pizza->bin_window;
+
+ m_internal->xanim_window =
+ ((GdkWindowPrivate *)window)->xwindow;
+#endif
+ // Get the XANIM atom
+ m_internal->xanim_atom = XInternAtom(m_internal->xanim_dpy,
+ "XANIM_PROPERTY", False);
+
+ // Build the command
+ xanim_command.Printf(wxT("xanim -Zr +Ze +Sr +f +W%d +f +q "
+ "+Av70 %s %s"), m_internal->xanim_window,
+ (xanim_chg_size) ? _T("") : _T(""),
+ WXSTRINGCAST m_filename);
+
+ // Execute it
+ if (!wxExecute(xanim_command, FALSE, m_xanim_detector))
+ return FALSE;
+
+ // Wait for XAnim to be ready
+ nitems = 0;
+ m_xanim_started = TRUE;
+ while (nitems == 0 && m_xanim_started) {
+ ret = XGetWindowProperty(m_internal->xanim_dpy, m_internal->xanim_window,
+ m_internal->xanim_atom,
+ 0, 4, False, AnyPropertyType, &prop_type,
+ &prop_format, &nitems, &extra,
+ (unsigned char **)&prop);
+ wxYield();
+ }
+
+ wxSize vibrato_size;
+
+ vibrato_size = m_video_output->GetSize();
+
+ vibrato_size.SetWidth(vibrato_size.GetWidth()+1);
+ m_video_output->SetSize(vibrato_size);
+ vibrato_size.SetWidth(vibrato_size.GetWidth()-1);
+ m_video_output->SetSize(vibrato_size);
+ // Very useful ! Actually it sends a SETSIZE event to XAnim
+
+ m_paused = FALSE;
+
+ return TRUE;
+}
#
-top_builddir = ../..
+top_srcdir = @top_srcdir@/..
+top_builddir = ../../..
VPATH= $(top_srcdir)/ogl
OBJECTS=basic.o bmpshape.o composit.o divided.o lines.o misc.o \
basic2.o canvas.o constrnt.o drawn.o mfutils.o ogldiag.o
+# the comment at the end of the next line is needed because otherwise autoconf
+# would remove this line completely - it contains a built-in hack to remove
+# any VPATH assignment not containing ':'
+VPATH = :$(top_srcdir)/contrib/src/ogl # ':' for autoconf
include $(top_builddir)/src/makelib.env
\membersection{wxProcess::wxProcess}\label{wxprocessconstr}
-\func{}{wxProcess}{\param{wxEvtHandler *}{ parent = NULL}, \param{bool}{ needPipe = FALSE}, \param{int}{ id = -1}}
+\func{}{wxProcess}{\param{wxEvtHandler *}{ parent = NULL}, \param{int}{ id = -1}}
Constructs a process object. {\it id} is only used in the case you want to
use wxWindows events. It identifies this object, or another window that will
receive the event.
-If you set {\it needPipe} to TRUE, wxExecute will try to open a couple of pipes
-to catch the subprocess stdio. The caught input stream is returned by
-GetOutputStream() as a non-seekable stream. The caught output stream is returned
-by GetInputStream() as a non-seekable stream.
-
If the {\it parent} parameter is different from NULL, it will receive
a wxEVT\_END\_PROCESS notification event (you should insert EVT\_END\_PROCESS
macro in the event table of the parent to handle it) with the given {\it id}.
\constfunc{wxInputStream* }{GetInputStream}{\void}
It returns a input stream correspoding to the output stream of the subprocess.
-If it is NULL, you have not set needPipe to TRUE.
+If it is NULL, you have not turned on the redirection.
+See \helpref{wxProcess::Redirect}{wxprocessredirect}.
\membersection{wxProcess::GetInputStream}\label{wxprocessgetinputstream}
\constfunc{wxInputStream* }{GetInputStream}{\void}
It returns a output stream corresponding to the input stream of the subprocess.
-If it is NULL, you have not set needPipe to TRUE.
+If it is NULL, you have not turned on the redirection.
+See \helpref{wxProcess::Redirect}{wxprocessredirect}.
\membersection{wxProcess::OnTerminate}\label{wxprocessonterminate}
\docparam{status}{The exit code of the process.}
+\membersection{wxProcess::Redirect}\label{wxprocessredirect}
+
+\func{void}{Redirect}{\void}
+
+It turns on the redirection, wxExecute will try to open a couple of pipes
+to catch the subprocess stdio. The caught input stream is returned by
+GetOutputStream() as a non-seekable stream. The caught output stream is returned
+by GetInputStream() as a non-seekable stream.
# From configure.in Id: configure.in
# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.14
+# Generated automatically using autoconf version 2.13
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
verbose=yes ;;
-version | --version | --versio | --versi | --vers)
- echo "configure generated by autoconf version 2.14"
+ echo "configure generated by autoconf version 2.13"
exit 0 ;;
-with-* | --with-*)
SAMPLES_SUBDIRS=$wx_cv_path_samplesubdirs
+PATH_IFS=$wx_cv_path_ifs
+PROGRAM_EXT=$wx_cv_program_ext
+WX_TARGET_LIBRARY=$wx_cv_target_library
+
+
+
+
+
trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
- echo "$CONFIG_STATUS generated by autoconf version 2.14"
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
exit 0 ;;
-help | --help | --hel | --he | --h)
echo "\$ac_cs_usage"; exit 0 ;;
s%@infodir@%$infodir%g
s%@mandir@%$mandir%g
s%@SAMPLES_SUBDIRS@%$SAMPLES_SUBDIRS%g
+s%@PATH_IFS@%$PATH_IFS%g
+s%@PROGRAM_EXT@%$PROGRAM_EXT%g
+s%@WX_TARGET_LIBRARY@%$WX_TARGET_LIBRARY%g
CEOF
EOF
SAMPLES_SUBDIRS=$wx_cv_path_samplesubdirs
AC_SUBST(SAMPLES_SUBDIRS)
+PATH_IFS=$wx_cv_path_ifs
+PROGRAM_EXT=$wx_cv_program_ext
+WX_TARGET_LIBRARY=$wx_cv_target_library
+
+AC_SUBST(PATH_IFS)
+AC_SUBST(PROGRAM_EXT)
+AC_SUBST(WX_TARGET_LIBRARY)
+
AC_OUTPUT([
Makefile
caret/Makefile
# From configure.in Id: configure.in
# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.14
+# Generated automatically using autoconf version 2.13
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
verbose=yes ;;
-version | --version | --versio | --versi | --vers)
- echo "configure generated by autoconf version 2.14"
+ echo "configure generated by autoconf version 2.13"
exit 0 ;;
-with-* | --with-*)
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
- echo "$CONFIG_STATUS generated by autoconf version 2.14"
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
exit 0 ;;
-help | --help | --hel | --he | --h)
echo "\$ac_cs_usage"; exit 0 ;;
trap 'rm -fr `echo "
Makefile
- wxMMedia2/Makefile
- wxMMedia2/lib/Makefile
- wxMMedia2/sample/Makefile
makegen/Makefile
HelpGen/Makefile
HelpGen/src/Makefile
cat >> $CONFIG_STATUS <<EOF
CONFIG_FILES=\${CONFIG_FILES-"Makefile
- wxMMedia2/Makefile
- wxMMedia2/lib/Makefile
- wxMMedia2/sample/Makefile
makegen/Makefile
HelpGen/Makefile
HelpGen/src/Makefile
AC_OUTPUT([
Makefile
- wxMMedia2/Makefile
- wxMMedia2/lib/Makefile
- wxMMedia2/sample/Makefile
makegen/Makefile
HelpGen/Makefile
HelpGen/src/Makefile
m_production_started = FALSE;
m_internal = new wxSoundInternal;
if (!m_internal) {
- m_snderror = wxSOUND_MEMERR;
+ m_snderror = wxSOUND_MEMERROR;
m_internal = NULL;
return;
}
- m_snderror = wxSOUND_NOERR;
+ m_snderror = wxSOUND_NOERROR;
// Setup defaults
CreateSndWindow();
}
}
+// -----------------------------------------------------------------------
+// _wxSoundHandlerWndProc: Window callback to handle buffer completion
+// -----------------------------------------------------------------------
LRESULT APIENTRY _EXPORT _wxSoundHandlerWndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
GlobalFree(info->m_h_header);
delete info;
- m_snderror = wxSOUND_IOERR;
+ m_snderror = wxSOUND_IOERROR;
return NULL;
}
} else if (mode == wxSOUND_OUTPUT) {
GlobalFree(info->m_h_header);
delete info;
- m_snderror = wxSOUND_IOERR;
+ m_snderror = wxSOUND_IOERROR;
return NULL;
}
}
// -------------------------------------------------------------------------
void wxSoundStreamWin::WaitFor(wxSoundInfoHeader *info)
{
- // If the buffer is finished, we return immediately
- if (!info->m_playing) {
-
- // We begun filling it: we must send it to the Windows queue
- if (info->m_position != 0) {
- memset(info->m_data + info->m_position, 0, info->m_size);
- AddToQueue(info);
+ // If the buffer is finished, we return immediately
+ if (!info->m_playing) {
+
+ // We begun filling it: we must send it to the Windows queue
+ if (info->m_position != 0) {
+ memset(info->m_data + info->m_position, 0, info->m_size);
+ AddToQueue(info);
+ }
}
- }
-
- if (m_waiting_for) {
- // PROBLEM //
- return;
- }
- m_waiting_for = TRUE;
- // Else, we wait for its termination
- while (info->m_playing || info->m_recording)
- wxYield();
- m_waiting_for = FALSE;
+
+ if (m_waiting_for) {
+ // PROBLEM //
+ return;
+ }
+ m_waiting_for = TRUE;
+ // Else, we wait for its termination
+ while (info->m_playing || info->m_recording)
+ wxYield();
+ m_waiting_for = FALSE;
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
bool wxSoundStreamWin::AddToQueue(wxSoundInfoHeader *info)
{
- MMRESULT result;
-
- if (info->m_mode == wxSOUND_INPUT) {
- // Increment the input fragment pointer
- result = waveInAddBuffer(m_internal->m_devin,
- info->m_header, sizeof(WAVEHDR));
- if (result == MMSYSERR_NOERROR)
- info->m_recording = TRUE;
- else
- return FALSE;
- } else if (info->m_mode == wxSOUND_OUTPUT) {
- result = waveOutWrite(m_internal->m_devout,
- info->m_header, sizeof(WAVEHDR));
- if (result == MMSYSERR_NOERROR)
+ MMRESULT result;
+
+ if (info->m_mode == wxSOUND_INPUT) {
+ // Increment the input fragment pointer
+ result = waveInAddBuffer(m_internal->m_devin,
+ info->m_header, sizeof(WAVEHDR));
+ if (result == MMSYSERR_NOERROR)
+ info->m_recording = TRUE;
+ else
+ return FALSE;
+ } else if (info->m_mode == wxSOUND_OUTPUT) {
+ result = waveOutWrite(m_internal->m_devout,
+ info->m_header, sizeof(WAVEHDR));
+ if (result == MMSYSERR_NOERROR)
info->m_playing = TRUE;
- else
- return FALSE;
- }
- return TRUE;
+ else
+ return FALSE;
+ }
+ return TRUE;
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
wxSoundStream& wxSoundStreamWin::Write(const void *buffer, wxUint32 len)
{
- m_lastcount = 0;
- if (!m_internal->m_output_enabled)
- return *this;
-
- while (len > 0) {
- wxSoundInfoHeader *header;
- wxUint32 to_copy;
-
- // Get a new output fragment
- header = NextFragmentOutput();
-
- to_copy = (len > header->m_size) ? header->m_size : len;
- memcpy(header->m_data + header->m_position, buffer, to_copy);
-
- header->m_position += to_copy;
- header->m_size -= to_copy;
- buffer = (((const char *)buffer) + to_copy);
- len -= to_copy;
- m_lastcount += to_copy;
-
- // If the fragment is full, we send it to the Windows queue.
- if (header->m_size == 0)
- if (!AddToQueue(header)) {
- m_snderror = wxSOUND_IOERR;
+ m_lastcount = 0;
+ if (!m_internal->m_output_enabled) {
+ m_snderror = wxSOUND_NOTSTARTED;
return *this;
- }
- }
- return *this;
+ }
+
+
+ while (len > 0) {
+ wxSoundInfoHeader *header;
+ wxUint32 to_copy;
+
+ // Get a new output fragment
+ header = NextFragmentOutput();
+
+ to_copy = (len > header->m_size) ? header->m_size : len;
+ memcpy(header->m_data + header->m_position, buffer, to_copy);
+
+ header->m_position += to_copy;
+ header->m_size -= to_copy;
+ buffer = (((const char *)buffer) + to_copy);
+ len -= to_copy;
+ m_lastcount += to_copy;
+
+ // If the fragment is full, we send it to the Windows queue.
+ if (header->m_size == 0)
+ if (!AddToQueue(header)) {
+ m_snderror = wxSOUND_IOERROR;
+ return *this;
+ }
+ }
+ return *this;
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
wxSoundInfoHeader *wxSoundStreamWin::NextFragmentInput()
{
- wxSoundInfoHeader *header;
-
- m_current_frag_in = (m_current_frag_in + 1) % WXSOUND_MAX_QUEUE;
-
- header = m_headers_rec[m_current_frag_in];
- if (header->m_recording)
- WaitFor(header);
-
- if (m_current_frag_in == m_input_frag_in)
- m_queue_filled = TRUE;
+ wxSoundInfoHeader *header;
- return header;
+ // Queue pointer: reader
+ m_current_frag_in = (m_current_frag_in + 1) % WXSOUND_MAX_QUEUE;
+
+ header = m_headers_rec[m_current_frag_in];
+ // If the current buffer is in recording mode, we must wait for its
+ // completion.
+ if (header->m_recording)
+ WaitFor(header);
+
+ // We reached the writer position: the queue is full.
+ if (m_current_frag_in == m_input_frag_in)
+ m_queue_filled = TRUE;
+
+ return header;
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
wxSoundStream& wxSoundStreamWin::Read(void *buffer, wxUint32 len)
{
- wxSoundInfoHeader *header;
- wxUint32 to_copy;
-
- m_lastcount = 0;
- if (!m_internal->m_input_enabled)
- return *this;
-
- while (len > 0) {
- header = NextFragmentInput();
-
- to_copy = (len > header->m_size) ? header->m_size : len;
- memcpy(buffer, header->m_data + header->m_position, to_copy);
-
- header->m_position += to_copy;
- header->m_size -= to_copy;
- buffer = (((char *)buffer) + to_copy);
- len -= to_copy;
- m_lastcount += to_copy;
-
- if (header->m_size == 0) {
- ClearHeader(header);
- if (!AddToQueue(header)) {
- m_snderror = wxSOUND_IOERR;
+ wxSoundInfoHeader *header;
+ wxUint32 to_copy;
+
+ m_lastcount = 0;
+ if (!m_internal->m_input_enabled)
return *this;
- }
+
+ while (len > 0) {
+ header = NextFragmentInput();
+
+ to_copy = (len > header->m_size) ? header->m_size : len;
+ memcpy(buffer, header->m_data + header->m_position, to_copy);
+
+ header->m_position += to_copy;
+ header->m_size -= to_copy;
+ buffer = (((char *)buffer) + to_copy);
+ len -= to_copy;
+ m_lastcount += to_copy;
+
+ if (header->m_size == 0) {
+ ClearHeader(header);
+ if (!AddToQueue(header)) {
+ m_snderror = wxSOUND_IOERROR;
+ return *this;
+ }
+ }
}
- }
- return *this;
+ return *this;
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
void wxSoundStreamWin::NotifyDoneBuffer(wxUint32 dev_handle, int flag)
{
- wxSoundInfoHeader *info;
-
- if (flag == wxSOUND_OUTPUT) {
- if (!m_internal->m_output_enabled)
- return;
-
- m_output_frag_out = (m_output_frag_out + 1) % WXSOUND_MAX_QUEUE;
- info = m_headers_play[m_output_frag_out];
- ClearHeader(info);
- m_queue_filled = FALSE;
- if (!m_waiting_for)
- OnSoundEvent(wxSOUND_OUTPUT);
- } else {
- if (!m_internal->m_input_enabled)
- return;
-
- m_headers_rec[m_input_frag_in]->m_recording = FALSE;
- m_input_frag_in = (m_input_frag_in + 1) % WXSOUND_MAX_QUEUE;
- if (!m_waiting_for)
- OnSoundEvent(wxSOUND_INPUT);
- m_queue_filled = FALSE;
- }
+ wxSoundInfoHeader *info;
+
+ if (flag == wxSOUND_OUTPUT) {
+ if (!m_internal->m_output_enabled)
+ return;
+
+ // Queue pointer: reader
+ m_output_frag_out = (m_output_frag_out + 1) % WXSOUND_MAX_QUEUE;
+ info = m_headers_play[m_output_frag_out];
+ // Clear header to tell the system the buffer is free now
+ ClearHeader(info);
+ m_queue_filled = FALSE;
+ if (!m_waiting_for)
+ // Try to requeue a new buffer.
+ OnSoundEvent(wxSOUND_OUTPUT);
+ } else {
+ if (!m_internal->m_input_enabled)
+ return;
+
+ // Recording completed
+ m_headers_rec[m_input_frag_in]->m_recording = FALSE;
+ // Queue pointer: writer
+ m_input_frag_in = (m_input_frag_in + 1) % WXSOUND_MAX_QUEUE;
+ if (!m_waiting_for)
+ OnSoundEvent(wxSOUND_INPUT);
+ m_queue_filled = FALSE;
+ }
}
// -------------------------------------------------------------------------
+// SetSoundFormat()
// -------------------------------------------------------------------------
bool wxSoundStreamWin::SetSoundFormat(wxSoundFormatBase& base)
{
}
// -------------------------------------------------------------------------
+// StartProduction()
// -------------------------------------------------------------------------
bool wxSoundStreamWin::StartProduction(int evt)
{
}
// -------------------------------------------------------------------------
-// -------------------------------------------------------------------------
+// StopProduction()
+// ------------------------------------------------------------------------
bool wxSoundStreamWin::StopProduction()
{
- if (!m_production_started)
- return FALSE;
-
- m_production_started = FALSE;
- CloseDevice();
- return TRUE;
+ if (!m_production_started) {
+ m_snderror = wxSOUND_NOTSTARTED;
+ return FALSE;
+ }
+
+ m_snderror = wxSOUND_NOERROR;
+ m_production_started = FALSE;
+ CloseDevice();
+ return TRUE;
}
// -------------------------------------------------------------------------
+// QueueFilled()
// -------------------------------------------------------------------------
bool wxSoundStreamWin::QueueFilled() const
{