2021-01-15 16:15:58 -05:00
|
|
|
/*
|
|
|
|
* Audio Library for Linux and Windows
|
|
|
|
* ===================================
|
|
|
|
* Author: DJ0ABR
|
|
|
|
*
|
|
|
|
* Author: Kurt Moraw, Ham radio: DJ0ABR, github: dj0abr
|
|
|
|
* License: GPL-3
|
|
|
|
*
|
|
|
|
* compilation:
|
|
|
|
* Windows ... Visual Studio
|
|
|
|
* Linux ... make
|
|
|
|
*
|
|
|
|
* Documentation see: libkmaudio.h
|
|
|
|
*
|
|
|
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*
|
|
|
|
* libkmaudio_init.cpp ... initialize portaudio (Windows only)
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "libkmaudio.h"
|
|
|
|
|
|
|
|
void kmaudio_close();
|
|
|
|
|
2021-02-22 09:58:19 -05:00
|
|
|
int keepcallbacksrunning = 1; // to stop callbacks at program end
|
2021-01-15 16:15:58 -05:00
|
|
|
|
|
|
|
int kmaudio_init()
|
|
|
|
{
|
|
|
|
kmaudio_close();
|
|
|
|
sleep_ms(100);
|
|
|
|
|
|
|
|
printf("libkmaudio_init\n");
|
|
|
|
|
2021-02-22 09:58:19 -05:00
|
|
|
keepcallbacksrunning = 1;
|
2021-01-15 16:15:58 -05:00
|
|
|
init_pipes(); // init fifo
|
|
|
|
init_maxarray(); // init array for maxlevel measurement
|
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
int err = Pa_Initialize();
|
|
|
|
if (err != paNoError)
|
|
|
|
{
|
|
|
|
printf("ERROR: Pa_Initialize returned 0x%x\n", err);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("PortAudio version: 0x%08X\n", Pa_GetVersion());
|
|
|
|
#else
|
|
|
|
return kmaudio_init_linux();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void kmaudio_close()
|
|
|
|
{
|
|
|
|
printf("libkmaudio_close\n");
|
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
for (int i = 0; i < devanz; i++)
|
|
|
|
{
|
|
|
|
if (devlist[i].capStream != NULL)
|
|
|
|
{
|
|
|
|
Pa_CloseStream(devlist[i].capStream);
|
|
|
|
devlist[i].capStream = NULL;
|
|
|
|
}
|
|
|
|
if (devlist[i].pbStream != NULL)
|
|
|
|
{
|
|
|
|
Pa_CloseStream(devlist[i].pbStream);
|
|
|
|
devlist[i].pbStream = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Pa_Terminate();
|
|
|
|
|
|
|
|
#else
|
|
|
|
kmaudio_close_linux();
|
|
|
|
#endif
|
2021-02-22 09:58:19 -05:00
|
|
|
keepcallbacksrunning = 0;
|
2021-01-15 16:15:58 -05:00
|
|
|
}
|
|
|
|
/*
|
|
|
|
// diagonstic routines for development
|
|
|
|
|
|
|
|
#define MAXSPDARR 10
|
|
|
|
int spdarr[MAXSPDARR];
|
|
|
|
int spdarrbps[MAXSPDARR];
|
|
|
|
|
|
|
|
#ifdef _LINUX_
|
|
|
|
uint64_t getms()
|
|
|
|
{
|
|
|
|
struct timeval tv;
|
|
|
|
gettimeofday(&tv, NULL);
|
|
|
|
uint64_t at = tv.tv_sec * 1000000 + tv.tv_usec;
|
|
|
|
at = at / 1000;
|
|
|
|
return at;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
uint64_t getms()
|
|
|
|
{
|
|
|
|
// get time in 100ns resolution
|
|
|
|
FILETIME ft_now;
|
|
|
|
GetSystemTimeAsFileTime(&ft_now);
|
|
|
|
|
|
|
|
// convert to full 64 bit time
|
|
|
|
uint64_t ll_now = (uint64_t)ft_now.dwLowDateTime + ((uint64_t)(ft_now.dwHighDateTime) << 32LL);
|
|
|
|
|
|
|
|
// convert to Milliseconds
|
|
|
|
ll_now /= (10 * 1000); // still needs 64 bit integer
|
|
|
|
|
|
|
|
return ll_now;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
uint64_t getms()
|
|
|
|
{
|
|
|
|
struct timeval tv;
|
|
|
|
gettimeofday(&tv, NULL);
|
|
|
|
uint64_t at = tv.tv_sec * 1000000 + tv.tv_usec;
|
|
|
|
at = at / 1000;
|
|
|
|
return at;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void measure_speed_bps(int len)
|
|
|
|
{
|
|
|
|
static uint64_t lasttim = 0;
|
|
|
|
static int elems = 0;
|
|
|
|
|
|
|
|
uint64_t tim = getms();
|
|
|
|
int timespan = (int)(tim - lasttim);
|
|
|
|
if (timespan < 0)
|
|
|
|
{
|
|
|
|
lasttim = tim;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
elems += len;
|
|
|
|
if (timespan < 1000) return;
|
|
|
|
|
|
|
|
double dspd = elems;
|
|
|
|
dspd = dspd * 1e3 / timespan;
|
|
|
|
int speed = (int)dspd;
|
|
|
|
|
|
|
|
// here we have number of elements after 1s
|
|
|
|
printf(" ======================= %d bit/s\n", speed);
|
|
|
|
|
|
|
|
elems = 0;
|
|
|
|
lasttim = tim;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sleep_ms(int ms)
|
|
|
|
{
|
|
|
|
#ifdef WIN32
|
|
|
|
Sleep(ms);
|
|
|
|
#else
|
|
|
|
usleep(ms * 1000);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
*/
|