Jack2 1.9.10

JackAudioAdapterFactory.cpp

00001 /*
00002 Copyright (C) 2008-2012 Grame
00003 
00004 This program is free software; you can redistribute it and/or modify
00005 it under the terms of the GNU General Public License as published by
00006 the Free Software Foundation; either version 2 of the License, or
00007 (at your option) any later version.
00008 
00009 This program is distributed in the hope that it will be useful,
00010 but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 GNU General Public License for more details.
00013 
00014 You should have received a copy of the GNU General Public License
00015 along with this program; if not, write to the Free Software
00016 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00017 
00018 */
00019 
00020 #include "JackAudioAdapter.h"
00021 #include "JackPlatformPlug.h"
00022 #include "JackArgParser.h"
00023 
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 #include <assert.h>
00027 
00028 #ifdef __APPLE__
00029 #include "JackCoreAudioAdapter.h"
00030 #define JackPlatformAdapter JackCoreAudioAdapter
00031 #endif
00032 
00033 #ifdef __linux__
00034 #include "JackAlsaAdapter.h"
00035 #define JackPlatformAdapter JackAlsaAdapter
00036 #endif
00037 
00038 #if defined(__sun__) || defined(sun)
00039 #include "JackOSSAdapter.h"
00040 #define JackPlatformAdapter JackOSSAdapter
00041 #endif
00042 
00043 #ifdef WIN32
00044 #include "JackPortAudioAdapter.h"
00045 #define JackPlatformAdapter JackPortAudioAdapter
00046 #endif
00047 
00048 #ifdef __cplusplus
00049 extern "C"
00050 {
00051 #endif
00052 
00053     using namespace Jack;
00054 
00055     SERVER_EXPORT int jack_internal_initialize(jack_client_t* jack_client, const JSList* params)
00056     {
00057         jack_log("Loading audioadapter");
00058 
00059         Jack::JackAudioAdapter* adapter;
00060         jack_nframes_t buffer_size = jack_get_buffer_size(jack_client);
00061         jack_nframes_t sample_rate = jack_get_sample_rate(jack_client);
00062 
00063         try {
00064 
00065             adapter = new Jack::JackAudioAdapter(jack_client, new Jack::JackPlatformAdapter(buffer_size, sample_rate, params), params);
00066             assert(adapter);
00067 
00068             if (adapter->Open() == 0) {
00069                 return 0;
00070             } else {
00071                 delete adapter;
00072                 return 1;
00073             }
00074 
00075         } catch (...) {
00076             jack_info("audioadapter allocation error");
00077             return 1;
00078         }
00079     }
00080 
00081     SERVER_EXPORT int jack_initialize(jack_client_t* jack_client, const char* load_init)
00082     {
00083         JSList* params = NULL;
00084         bool parse_params = true;
00085         int res = 1;
00086         jack_driver_desc_t* desc = jack_get_descriptor();
00087 
00088         Jack::JackArgParser parser(load_init);
00089         if (parser.GetArgc() > 0) {
00090             parse_params = parser.ParseParams(desc, &params);
00091         }
00092 
00093         if (parse_params) {
00094             res = jack_internal_initialize(jack_client, params);
00095             parser.FreeParams(params);
00096         }
00097         return res;
00098     }
00099 
00100     SERVER_EXPORT void jack_finish(void* arg)
00101     {
00102         Jack::JackAudioAdapter* adapter = static_cast<Jack::JackAudioAdapter*>(arg);
00103 
00104         if (adapter) {
00105             jack_log("Unloading audioadapter");
00106             adapter->Close();
00107             delete adapter;
00108         }
00109     }
00110 
00111 #ifdef __cplusplus
00112 }
00113 #endif