kopia lustrzana https://github.com/Dsplib/libdspl-2.0
603 wiersze
23 KiB
C
603 wiersze
23 KiB
C
/*
|
||
* Copyright (c) 2015-2020 Sergey Bakhurin
|
||
* Digital Signal Processing Library [http://dsplib.org]
|
||
*
|
||
* This file is part of libdspl-2.0.
|
||
*
|
||
* is free software: you can redistribute it and/or modify
|
||
* it under the terms of the GNU Lesser General Public License as published by
|
||
* the Free Software Foundation, either version 3 of the License, or
|
||
* (at your option) any later version.
|
||
*
|
||
* DSPL 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 Lesser General Public License
|
||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
|
||
|
||
#ifdef WIN_OS
|
||
#include <windows.h>
|
||
#endif /* WIN_OS */
|
||
|
||
#ifdef LINUX_OS
|
||
#include <dlfcn.h>
|
||
#endif /* LINUX_OS */
|
||
|
||
|
||
#include <stdio.h>
|
||
#include "dspl.h"
|
||
|
||
|
||
#ifndef BUILD_LIB
|
||
|
||
p_acos_cmplx acos_cmplx ;
|
||
p_addlog addlog ;
|
||
p_array_scale_lin array_scale_lin ;
|
||
p_asin_cmplx asin_cmplx ;
|
||
|
||
p_butter_ap butter_ap ;
|
||
p_bessel_i0 bessel_i0 ;
|
||
p_bilinear bilinear ;
|
||
p_butter_ap_zp butter_ap_zp ;
|
||
|
||
p_cheby_poly1 cheby_poly1 ;
|
||
p_cheby_poly2 cheby_poly2 ;
|
||
p_cheby1_ap cheby1_ap ;
|
||
p_cheby1_ap_zp cheby1_ap_zp ;
|
||
p_cheby2_ap cheby2_ap ;
|
||
p_cheby2_ap_wp1 cheby2_ap_wp1 ;
|
||
p_cheby2_ap_zp cheby2_ap_zp ;
|
||
p_cmplx2re cmplx2re ;
|
||
p_concat concat ;
|
||
p_conv conv ;
|
||
p_conv_cmplx conv_cmplx ;
|
||
p_conv_fft conv_fft ;
|
||
p_conv_fft_cmplx conv_fft_cmplx ;
|
||
p_cos_cmplx cos_cmplx ;
|
||
|
||
p_decimate decimate ;
|
||
p_decimate_cmplx decimate_cmplx ;
|
||
p_dft dft ;
|
||
p_dft_cmplx dft_cmplx ;
|
||
p_dmod dmod ;
|
||
p_dspl_info dspl_info ;
|
||
|
||
p_ellip_acd ellip_acd ;
|
||
p_ellip_acd_cmplx ellip_acd_cmplx ;
|
||
p_ellip_ap ellip_ap ;
|
||
p_ellip_ap_zp ellip_ap_zp ;
|
||
p_ellip_asn ellip_asn ;
|
||
p_ellip_asn_cmplx ellip_asn_cmplx ;
|
||
p_ellip_cd ellip_cd ;
|
||
p_ellip_cd_cmplx ellip_cd_cmplx ;
|
||
p_ellip_landen ellip_landen ;
|
||
p_ellip_modulareq ellip_modulareq ;
|
||
p_ellip_rat ellip_rat ;
|
||
p_ellip_sn ellip_sn ;
|
||
p_ellip_sn_cmplx ellip_sn_cmplx ;
|
||
|
||
p_farrow_lagrange farrow_lagrange ;
|
||
p_farrow_spline farrow_spline ;
|
||
p_fft fft ;
|
||
p_fft_abs fft_abs ;
|
||
p_fft_abs_cmplx fft_abs_cmplx ;
|
||
p_fft_cmplx fft_cmplx ;
|
||
p_fft_create fft_create ;
|
||
p_fft_free fft_free ;
|
||
p_fft_mag fft_mag ;
|
||
p_fft_mag_cmplx fft_mag_cmplx ;
|
||
p_fft_shift fft_shift ;
|
||
p_fft_shift_cmplx fft_shift_cmplx ;
|
||
p_filter_freq_resp filter_freq_resp ;
|
||
p_filter_iir filter_iir ;
|
||
p_filter_ws1 filter_ws1 ;
|
||
p_filter_zp2ab filter_zp2ab ;
|
||
p_find_max_abs find_max_abs ;
|
||
p_fir_linphase fir_linphase ;
|
||
p_flipip flipip ;
|
||
p_flipip_cmplx flipip_cmplx ;
|
||
p_fourier_integral_cmplx fourier_integral_cmplx ;
|
||
p_fourier_series_dec fourier_series_dec ;
|
||
p_fourier_series_dec_cmplx fourier_series_dec_cmplx ;
|
||
p_fourier_series_rec fourier_series_rec ;
|
||
p_freqs freqs ;
|
||
p_freqs_cmplx freqs_cmplx ;
|
||
p_freqs2time freqs2time ;
|
||
p_freqz freqz ;
|
||
|
||
p_gnuplot_close gnuplot_close ;
|
||
p_gnuplot_cmd gnuplot_cmd ;
|
||
p_gnuplot_create gnuplot_create ;
|
||
p_gnuplot_open gnuplot_open ;
|
||
p_goertzel goertzel ;
|
||
p_goertzel_cmplx goertzel_cmplx ;
|
||
p_group_delay group_delay ;
|
||
|
||
p_histogram histogram ;
|
||
p_histogram_norm histogram_norm ;
|
||
|
||
p_idft_cmplx idft_cmplx ;
|
||
p_ifft_cmplx ifft_cmplx ;
|
||
p_iir iir ;
|
||
|
||
p_linspace linspace ;
|
||
p_log_cmplx log_cmplx ;
|
||
p_logspace logspace ;
|
||
p_low2bp low2bp ;
|
||
p_low2bs low2bs ;
|
||
p_low2high low2high ;
|
||
p_low2low low2low ;
|
||
|
||
p_matrix_eig_cmplx matrix_eig_cmplx ;
|
||
p_matrix_eye matrix_eye ;
|
||
p_matrix_eye_cmplx matrix_eye_cmplx ;
|
||
p_matrix_mul matrix_mul ;
|
||
p_matrix_print matrix_print ;
|
||
p_matrix_print_cmplx matrix_print_cmplx ;
|
||
p_matrix_transpose matrix_transpose ;
|
||
p_matrix_transpose_cmplx matrix_transpose_cmplx ;
|
||
p_matrix_transpose_hermite matrix_transpose_hermite ;
|
||
p_mean mean ;
|
||
p_mean_cmplx mean_cmplx ;
|
||
p_minmax minmax ;
|
||
|
||
p_ones ones ;
|
||
|
||
p_phase_delay phase_delay ;
|
||
p_poly_z2a_cmplx poly_z2a_cmplx ;
|
||
p_polyroots polyroots ;
|
||
p_polyval polyval ;
|
||
p_polyval_cmplx polyval_cmplx ;
|
||
p_psd_bartlett psd_bartlett ;
|
||
p_psd_bartlett_cmplx psd_bartlett_cmplx ;
|
||
p_psd_periodogram psd_periodogram ;
|
||
p_psd_periodogram_cmplx psd_periodogram_cmplx ;
|
||
p_psd_welch psd_welch ;
|
||
p_psd_welch_cmplx psd_welch_cmplx ;
|
||
|
||
p_randb randb ;
|
||
p_randb2 randb2 ;
|
||
p_randi randi ;
|
||
p_randn randn ;
|
||
p_randn_cmplx randn_cmplx ;
|
||
p_random_init random_init ;
|
||
p_randu randu ;
|
||
p_ratcompos ratcompos ;
|
||
p_re2cmplx re2cmplx ;
|
||
p_readbin readbin ;
|
||
|
||
p_signal_pimp signal_pimp ;
|
||
p_signal_saw signal_saw ;
|
||
p_sin_cmplx sin_cmplx ;
|
||
p_sinc sinc ;
|
||
p_sine_int sine_int ;
|
||
p_sqrt_cmplx sqrt_cmplx ;
|
||
p_std std ;
|
||
p_std_cmplx std_cmplx ;
|
||
|
||
p_trapint trapint ;
|
||
p_trapint_cmplx trapint_cmplx ;
|
||
|
||
p_unwrap unwrap ;
|
||
|
||
p_vector_dot vector_dot ;
|
||
p_verif verif ;
|
||
p_verif_data_gen verif_data_gen ;
|
||
p_verif_cmplx verif_cmplx ;
|
||
p_verif_str verif_str ;
|
||
p_verif_str_cmplx verif_str_cmplx ;
|
||
|
||
p_window window ;
|
||
p_writebin writebin ;
|
||
p_writetxt writetxt ;
|
||
p_writetxt_3d writetxt_3d ;
|
||
p_writetxt_3dline writetxt_3dline ;
|
||
p_writetxt_cmplx writetxt_cmplx ;
|
||
p_writetxt_cmplx_im writetxt_cmplx_im ;
|
||
p_writetxt_cmplx_re writetxt_cmplx_re ;
|
||
p_writetxt_int writetxt_int ;
|
||
|
||
p_xcorr xcorr ;
|
||
p_xcorr_cmplx xcorr_cmplx ;
|
||
|
||
|
||
#ifdef WIN_OS
|
||
#define LOAD_FUNC(fn) \
|
||
fname = #fn;\
|
||
fn = (p_##fn)GetProcAddress(handle, fname);\
|
||
if(! fn) goto exit_label;
|
||
#endif
|
||
|
||
|
||
|
||
#ifdef LINUX_OS
|
||
#define LOAD_FUNC(fn) \
|
||
fname = #fn;\
|
||
fn = (p_##fn)dlsym(handle, fname);\
|
||
if ((error = dlerror()) != NULL) goto exit_label
|
||
#endif
|
||
|
||
|
||
|
||
#ifdef DOXYGEN_ENGLISH
|
||
/*! ****************************************************************************
|
||
\ingroup SYS_LOADING_GROUP
|
||
\fn void* dspl_load()
|
||
\brief Perform dynamic linking and load libdspl-2.0 functions.
|
||
|
||
This function attempts to link to the library `libdspl.dll` in
|
||
Windows system and the `libdspl.so` library on the Linux system.
|
||
The library is assumed to be in the same directory as the application.
|
||
user, or the path to the library is registered in the operating path variables
|
||
system.
|
||
|
||
Upon successful binding and loading of library functions, the handle is returned
|
||
libraries, as well as in the address space of the application appear
|
||
pointers to libdspl-2.0 functions.
|
||
|
||
\note
|
||
The returned handle is of type `void *`, which can be cast on Windows
|
||
to type `HINSTANCE`. In practice, this is not necessary, because this
|
||
the type is cast to `HINSTANCE` automatically if the compiler flag is set,
|
||
indicating that the application is being built on Windows.
|
||
|
||
An example of a simple program that implements dynamic binding with DSPL-2.0.
|
||
|
||
\code
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include "dspl.h"
|
||
|
||
int main (int argc, char* argv[])
|
||
{
|
||
void * hdspl; // DSPL handle
|
||
hdspl = dspl_load (); // Dynamic linking
|
||
|
||
// Check the pointer. If `NULL`, then the link failed
|
||
if (! hdspl)
|
||
{
|
||
printf ("libdspl loading error! \n");
|
||
return -1;
|
||
}
|
||
|
||
// The link was successful, you can call the functions of DSPL-2.0
|
||
|
||
//Before correctly terminating the application, you must unlink
|
||
//library and clear memory.
|
||
dspl_free(hdspl);
|
||
|
||
return 0;
|
||
}
|
||
\endcode
|
||
|
||
\author Bakhurin Sergey. www.dsplib.org
|
||
***************************************************************************** */
|
||
#endif
|
||
#ifdef DOXYGEN_RUSSIAN
|
||
/*! ****************************************************************************
|
||
\ingroup SYS_LOADING_GROUP
|
||
\fn void* dspl_load()
|
||
\brief Произвести динамическую линковку и загрузить функции libdspl-2.0.
|
||
|
||
Данная функция производит попытку связывания с библиотекой `libdspl.dll` в
|
||
системе Windows и с библиотекой `libdspl.so` в системе Linux.
|
||
Предполагается, что библиотека находится в одной директории с приложением
|
||
пользователя, или путь к библиотеке прописан в переменных пути операционной
|
||
системы.
|
||
|
||
При удачном связывании и загрузке функций библиотеки возвращается хэндл
|
||
библиотеки, а также в адресном пространстве приложения появляются
|
||
указатели на функции libdspl-2.0.
|
||
|
||
\note
|
||
Возвращаемый хэндл имеет тип `void*`, который в ОС Windows может быть приведен
|
||
к типу `HINSTANCE`. На практике необходимости в этом, нет, потому что данный
|
||
тип приводится к `HINSTANCE` автоматически, если выставлен флаг компилятора,
|
||
указывающий, что сборка приложения производится в ОС Windows.
|
||
|
||
Пример простейшей программы реализующей динамическое связывание с DSPL-2.0.
|
||
|
||
\code
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include "dspl.h"
|
||
|
||
int main(int argc, char* argv[])
|
||
{
|
||
void* hdspl; // DSPL хэндл
|
||
hdspl = dspl_load(); // Динамическая линковка
|
||
|
||
// Проверяем указатель. Если `NULLL`, то линковка прошла неудачно
|
||
if(!hdspl)
|
||
{
|
||
printf("libdspl loading error!\n");
|
||
return -1;
|
||
}
|
||
|
||
// Линковка прошла успешно можно вызывать функции DSPL-2.0
|
||
|
||
// Перед корректным завершением приложения необходимо разлинковать
|
||
// библиотеку и очистить память.
|
||
dspl_free(hdspl);
|
||
|
||
return 0;
|
||
}
|
||
\endcode
|
||
|
||
\author Бахурин Сергей. www.dsplib.org
|
||
***************************************************************************** */
|
||
#endif
|
||
void* dspl_load()
|
||
{
|
||
char* fname;
|
||
#ifdef WIN_OS
|
||
HINSTANCE handle;
|
||
handle = LoadLibrary(TEXT("libdspl.dll"));
|
||
if (!handle)
|
||
{
|
||
printf("libdspl.dll loading ERROR!\n");
|
||
return NULL;
|
||
}
|
||
#endif /* WIN_OS */
|
||
|
||
|
||
#ifdef LINUX_OS
|
||
char* error;
|
||
void *handle;
|
||
/* open the *.so */
|
||
handle = dlopen ("./libdspl.so", RTLD_LAZY);
|
||
if (!handle)
|
||
{
|
||
printf("libdspl.so loading ERROR!\n");
|
||
return NULL;
|
||
}
|
||
#endif /* LINUX_OS */
|
||
|
||
LOAD_FUNC(acos_cmplx);
|
||
LOAD_FUNC(addlog);
|
||
LOAD_FUNC(array_scale_lin);
|
||
LOAD_FUNC(asin_cmplx);
|
||
|
||
LOAD_FUNC(bessel_i0);
|
||
LOAD_FUNC(bilinear);
|
||
LOAD_FUNC(butter_ap);
|
||
LOAD_FUNC(butter_ap_zp);
|
||
|
||
LOAD_FUNC(cheby_poly1);
|
||
LOAD_FUNC(cheby_poly2);
|
||
LOAD_FUNC(cheby1_ap);
|
||
LOAD_FUNC(cheby1_ap_zp);
|
||
LOAD_FUNC(cheby2_ap);
|
||
LOAD_FUNC(cheby2_ap_wp1);
|
||
LOAD_FUNC(cheby2_ap_zp);
|
||
LOAD_FUNC(cmplx2re);
|
||
LOAD_FUNC(concat);
|
||
LOAD_FUNC(conv);
|
||
LOAD_FUNC(conv_cmplx);
|
||
LOAD_FUNC(conv_fft);
|
||
LOAD_FUNC(conv_fft_cmplx);
|
||
LOAD_FUNC(cos_cmplx);
|
||
|
||
LOAD_FUNC(decimate);
|
||
LOAD_FUNC(decimate_cmplx);
|
||
LOAD_FUNC(dft);
|
||
LOAD_FUNC(dft_cmplx);
|
||
LOAD_FUNC(dmod);
|
||
LOAD_FUNC(dspl_info);
|
||
|
||
LOAD_FUNC(ellip_acd);
|
||
LOAD_FUNC(ellip_acd_cmplx);
|
||
LOAD_FUNC(ellip_ap);
|
||
LOAD_FUNC(ellip_ap_zp);
|
||
LOAD_FUNC(ellip_asn);
|
||
LOAD_FUNC(ellip_asn_cmplx);
|
||
LOAD_FUNC(ellip_cd);
|
||
LOAD_FUNC(ellip_cd_cmplx);
|
||
LOAD_FUNC(ellip_landen);
|
||
LOAD_FUNC(ellip_modulareq);
|
||
LOAD_FUNC(ellip_rat);
|
||
LOAD_FUNC(ellip_sn);
|
||
LOAD_FUNC(ellip_sn_cmplx);
|
||
|
||
LOAD_FUNC(farrow_lagrange);
|
||
LOAD_FUNC(farrow_spline);
|
||
LOAD_FUNC(fft);
|
||
LOAD_FUNC(fft_cmplx);
|
||
LOAD_FUNC(fft_create);
|
||
LOAD_FUNC(fft_free);
|
||
LOAD_FUNC(fft_mag);
|
||
LOAD_FUNC(fft_mag_cmplx);
|
||
LOAD_FUNC(fft_shift);
|
||
LOAD_FUNC(fft_shift_cmplx);
|
||
LOAD_FUNC(filter_freq_resp);
|
||
LOAD_FUNC(filter_iir);
|
||
LOAD_FUNC(filter_ws1);
|
||
LOAD_FUNC(filter_zp2ab);
|
||
LOAD_FUNC(find_max_abs);
|
||
LOAD_FUNC(fir_linphase);
|
||
LOAD_FUNC(flipip);
|
||
LOAD_FUNC(flipip_cmplx);
|
||
LOAD_FUNC(fourier_integral_cmplx);
|
||
LOAD_FUNC(fourier_series_dec);
|
||
LOAD_FUNC(fourier_series_dec_cmplx);
|
||
LOAD_FUNC(fourier_series_rec);
|
||
LOAD_FUNC(freqz);
|
||
LOAD_FUNC(freqs);
|
||
LOAD_FUNC(freqs_cmplx);
|
||
LOAD_FUNC(freqs2time);
|
||
|
||
LOAD_FUNC(gnuplot_close);
|
||
LOAD_FUNC(gnuplot_cmd);
|
||
LOAD_FUNC(gnuplot_create);
|
||
LOAD_FUNC(gnuplot_open);
|
||
LOAD_FUNC(goertzel);
|
||
LOAD_FUNC(goertzel_cmplx);
|
||
LOAD_FUNC(group_delay);
|
||
|
||
LOAD_FUNC(histogram);
|
||
LOAD_FUNC(histogram_norm);
|
||
|
||
LOAD_FUNC(idft_cmplx);
|
||
LOAD_FUNC(ifft_cmplx);
|
||
LOAD_FUNC(iir);
|
||
|
||
LOAD_FUNC(linspace);
|
||
LOAD_FUNC(log_cmplx);
|
||
LOAD_FUNC(logspace);
|
||
LOAD_FUNC(low2bp);
|
||
LOAD_FUNC(low2bs);
|
||
LOAD_FUNC(low2high);
|
||
LOAD_FUNC(low2low);
|
||
|
||
LOAD_FUNC(matrix_eig_cmplx);
|
||
LOAD_FUNC(matrix_eye);
|
||
LOAD_FUNC(matrix_eye_cmplx);
|
||
LOAD_FUNC(matrix_mul);
|
||
LOAD_FUNC(matrix_print);
|
||
LOAD_FUNC(matrix_print_cmplx);
|
||
LOAD_FUNC(matrix_transpose);
|
||
LOAD_FUNC(matrix_transpose_cmplx);
|
||
LOAD_FUNC(matrix_transpose_hermite);
|
||
LOAD_FUNC(mean);
|
||
LOAD_FUNC(mean_cmplx);
|
||
LOAD_FUNC(minmax);
|
||
|
||
LOAD_FUNC(ones);
|
||
|
||
LOAD_FUNC(phase_delay);
|
||
LOAD_FUNC(poly_z2a_cmplx);
|
||
LOAD_FUNC(polyroots);
|
||
LOAD_FUNC(polyval);
|
||
LOAD_FUNC(polyval_cmplx);
|
||
LOAD_FUNC(psd_bartlett);
|
||
LOAD_FUNC(psd_bartlett_cmplx);
|
||
LOAD_FUNC(psd_periodogram);
|
||
LOAD_FUNC(psd_periodogram_cmplx);
|
||
LOAD_FUNC(psd_welch);
|
||
LOAD_FUNC(psd_welch_cmplx);
|
||
|
||
LOAD_FUNC(randi);
|
||
LOAD_FUNC(randb);
|
||
LOAD_FUNC(randb2);
|
||
LOAD_FUNC(randn);
|
||
LOAD_FUNC(randn_cmplx);
|
||
LOAD_FUNC(random_init);
|
||
LOAD_FUNC(randu);
|
||
LOAD_FUNC(ratcompos);
|
||
LOAD_FUNC(re2cmplx);
|
||
LOAD_FUNC(readbin);
|
||
|
||
LOAD_FUNC(signal_pimp);
|
||
LOAD_FUNC(signal_saw);
|
||
LOAD_FUNC(sin_cmplx);
|
||
LOAD_FUNC(sinc);
|
||
LOAD_FUNC(sine_int);
|
||
LOAD_FUNC(sqrt_cmplx);
|
||
LOAD_FUNC(std);
|
||
LOAD_FUNC(std_cmplx);
|
||
|
||
LOAD_FUNC(trapint);
|
||
LOAD_FUNC(trapint_cmplx);
|
||
|
||
LOAD_FUNC(unwrap);
|
||
|
||
LOAD_FUNC(vector_dot);
|
||
LOAD_FUNC(verif);
|
||
LOAD_FUNC(verif_data_gen);
|
||
LOAD_FUNC(verif_cmplx);
|
||
LOAD_FUNC(verif_str);
|
||
LOAD_FUNC(verif_str_cmplx);
|
||
|
||
LOAD_FUNC(window);
|
||
LOAD_FUNC(writebin);
|
||
LOAD_FUNC(writetxt);
|
||
LOAD_FUNC(writetxt_3d);
|
||
LOAD_FUNC(writetxt_3dline);
|
||
LOAD_FUNC(writetxt_cmplx);
|
||
LOAD_FUNC(writetxt_cmplx_im);
|
||
LOAD_FUNC(writetxt_cmplx_re);
|
||
LOAD_FUNC(writetxt_int);
|
||
|
||
LOAD_FUNC(xcorr);
|
||
LOAD_FUNC(xcorr_cmplx);
|
||
|
||
|
||
#ifdef WIN_OS
|
||
return (void*)handle;
|
||
exit_label:
|
||
printf("function %s loading ERROR!\n", fname);
|
||
if(handle)
|
||
FreeLibrary(handle);
|
||
return NULL;
|
||
#endif /* WIN_OS */
|
||
|
||
|
||
#ifdef LINUX_OS
|
||
return handle;
|
||
exit_label:
|
||
printf("function %s loading ERROR!\n", fname);
|
||
if(handle)
|
||
dlclose(handle);
|
||
return NULL;
|
||
#endif /* LINUX_OS */
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
#ifdef DOXYGEN_ENGLISH
|
||
/*! ****************************************************************************
|
||
\ingroup SYS_LOADING_GROUP
|
||
\fn void dspl_free(void* handle)
|
||
\brief Cleans up the previously linked DSPL-2.0 dynamic library.
|
||
|
||
This cross-platform function clears the library `libdspl.dll` in
|
||
Windows system and from the library `libdspl.so` on the Linux system.
|
||
After cleaning the library, all functions will become unavailable.
|
||
|
||
\param [in] handle
|
||
Handle of the previously linked DSPL-2.0 library. \n
|
||
This pointer can be `NULL`, in this case no action
|
||
are being produced.
|
||
|
||
\author Bakhurin Sergey. www.dsplib.org
|
||
***************************************************************************** */
|
||
#endif
|
||
#ifdef DOXYGEN_RUSSIAN
|
||
/*! ****************************************************************************
|
||
\ingroup SYS_LOADING_GROUP
|
||
\fn void dspl_free(void* handle)
|
||
\brief Очищает связанную ранее динамическую библиотеку DSPL-2.0.
|
||
|
||
Данная кроссплатформенная функция производит очистку библиотеки `libdspl.dll` в
|
||
системе Windows и с библиотеки `libdspl.so` в системе Linux.
|
||
После очистки библиотеки все функции станут недоступны.
|
||
|
||
\param[in] handle
|
||
Хэндл прилинкованной ранее библиотеки DSPL-2.0. \n
|
||
Данный указатель может быть `NULL`, в этом случае никакие действия не
|
||
производятся.
|
||
|
||
\author Бахурин Сергей. www.dsplib.org
|
||
**************************************************************************** */
|
||
#endif
|
||
void dspl_free(void* handle)
|
||
{
|
||
#ifdef WIN_OS
|
||
FreeLibrary((HINSTANCE)handle);
|
||
#endif /* WIN_OS */
|
||
|
||
#ifdef LINUX_OS
|
||
dlclose(handle);
|
||
#endif /* LINUX_OS */
|
||
}
|
||
|
||
#endif /* BUILD_LIB */
|