| 
							- /*
 -  * Wine+JACK Test
 -  * Copyright (C) 2015 Filipe Coelho <falktx@falktx.com>
 -  *
 -  * 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 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.
 -  *
 -  * For a full copy of the GNU General Public License see the doc/GPL.txt file.
 -  */
 - 
 - #include <semaphore.h>
 - #include <stdio.h>
 - #include <signal.h>
 - #include <unistd.h>
 - #include <windows.h>
 - 
 - #include <sys/types.h>
 - #include <jack/jack.h>
 - 
 - #undef _WIN32
 - #include <jack/thread.h>
 - 
 - static bool gCloseNow = false;
 - 
 - static void _close(int)
 - {
 -     gCloseNow = true;
 - }
 - 
 - static int _process(jack_nframes_t, void*)
 - {
 -     printf("%s\n", __PRETTY_FUNCTION__);
 -     return 0;
 - }
 - 
 - #if 0
 - // TEST
 - void* (*creator_func)(void*) = NULL;
 - void* creator_arg = NULL;
 - HANDLE creator_handle = 0;
 - pthread_t creator_pthread = 0;
 - 
 - static DWORD WINAPI thread_creator_helper(LPVOID)
 - {
 -     printf("%s\n", __PRETTY_FUNCTION__);
 -     creator_pthread = pthread_self();
 -     SetEvent(creator_handle);
 -     creator_func(creator_arg);
 -     return 0;
 - }
 - 
 - static int thread_creator(pthread_t* thread_id, const pthread_attr_t*, void *(*function)(void*), void* arg)
 - {
 -     printf("%s\n", __PRETTY_FUNCTION__);
 -     creator_func   = function;
 -     creator_arg    = arg;
 -     creator_handle = ::CreateEventA(NULL, false, false, NULL);
 - 
 -     ::CreateThread(NULL, 0, thread_creator_helper, arg, 0, 0);
 -     ::WaitForSingleObject(creator_handle, INFINITE);
 - 
 -     *thread_id = creator_pthread;
 -     return 0;
 - }
 - #endif
 - 
 - struct JackWineThread {
 -         void* (*func)(void*);
 -         void* arg;
 -         pthread_t pthid;
 -         sem_t sema;
 - };
 - 
 - static DWORD WINAPI
 - wine_thread_aux( LPVOID arg ) {
 -         struct JackWineThread* jwt = (struct JackWineThread*) arg;
 - 
 -     printf("%s\n", __PRETTY_FUNCTION__);
 - 
 -         void* func_arg = jwt->arg;
 -         void* (*func)(void*) = jwt->func;
 - 
 -         jwt->pthid = pthread_self();
 -         sem_post( &jwt->sema );
 - 
 -         func ( func_arg );
 - 
 -         return 0;
 - }
 - 
 - static int
 - wine_thread_create (pthread_t* thread_id, const pthread_attr_t*, void *(*function)(void*), void* arg) {
 -         struct JackWineThread jwt;
 - 
 -     printf("%s\n", __PRETTY_FUNCTION__);
 - 
 -         sem_init( &jwt.sema, 0, 0 );
 -         jwt.func = function;
 -         jwt.arg = arg;
 - 
 -         CreateThread( NULL, 0, wine_thread_aux, &jwt, 0, 0 );
 -         sem_wait( &jwt.sema );
 - 
 -         *thread_id = jwt.pthid;
 -         return 0;
 - }
 - 
 - int main()
 - {
 -     struct sigaction sterm;
 -     sterm.sa_handler  = _close;
 -     sterm.sa_flags    = SA_RESTART;
 -     sterm.sa_restorer = NULL;
 -     sigemptyset(&sterm.sa_mask);
 -     sigaction(SIGTERM, &sterm, NULL);
 -     sigaction(SIGINT,  &sterm, NULL);
 - 
 -     jack_set_thread_creator(wine_thread_create);
 - 
 -     jack_client_t* const client = jack_client_open("WineJack2", JackNullOption, NULL);
 -     if (client == NULL)
 -         return 1;
 - 
 -     jack_set_process_callback(client, _process, NULL);
 -     jack_activate(client);
 - 
 -     for (; ! gCloseNow;) {
 -         usleep(100000);
 -     }
 - 
 -     jack_deactivate(client);
 -     jack_client_close(client);
 - 
 -     return 0;
 - }
 
 
  |