178 lines
3.2 KiB
C
178 lines
3.2 KiB
C
/* main.c
|
|
|
|
This file is part of a program that implements a Software-Defined Radio.
|
|
|
|
Copyright (C) 2013 Warren Pratt, NR0V
|
|
|
|
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
The author can be reached by email at
|
|
|
|
warren@wpratt.com
|
|
|
|
*/
|
|
|
|
#include "comm.h"
|
|
|
|
void wdspmain (void *pargs)
|
|
{
|
|
#if defined(_WIN32)
|
|
DWORD taskIndex = 0;
|
|
HANDLE hTask = AvSetMmThreadCharacteristics(TEXT("Pro Audio"), &taskIndex);
|
|
if (hTask != 0) AvSetMmThreadPriority(hTask, 2);
|
|
else SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
|
|
#endif
|
|
|
|
int channel = (int)(uintptr_t)pargs;
|
|
while (_InterlockedAnd (&ch[channel].run, 1))
|
|
{
|
|
WaitForSingleObject(ch[channel].iob.pd->Sem_BuffReady,INFINITE);
|
|
EnterCriticalSection (&ch[channel].csDSP);
|
|
if (!_InterlockedAnd (&ch[channel].iob.pd->exec_bypass, 1))
|
|
{
|
|
switch (ch[channel].type)
|
|
{
|
|
case 0: // rxa
|
|
dexchange (channel, rxa[channel].outbuff, rxa[channel].inbuff);
|
|
xrxa (channel);
|
|
break;
|
|
case 1: // txa
|
|
dexchange (channel, txa[channel].outbuff, txa[channel].inbuff);
|
|
xtxa (channel);
|
|
break;
|
|
case 31: //
|
|
|
|
break;
|
|
}
|
|
}
|
|
LeaveCriticalSection (&ch[channel].csDSP);
|
|
}
|
|
#if defined(_WIN32)
|
|
if (hTask != 0) AvRevertMmThreadCharacteristics (hTask);
|
|
#endif
|
|
}
|
|
|
|
void create_main (int channel)
|
|
{
|
|
switch (ch[channel].type)
|
|
{
|
|
case 0:
|
|
create_rxa (channel);
|
|
break;
|
|
case 1:
|
|
create_txa (channel);
|
|
break;
|
|
case 31: //
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
void destroy_main (int channel)
|
|
{
|
|
switch (ch[channel].type)
|
|
{
|
|
case 0:
|
|
destroy_rxa (channel);
|
|
break;
|
|
case 1:
|
|
destroy_txa (channel);
|
|
break;
|
|
case 31: //
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
void flush_main (int channel)
|
|
{
|
|
switch (ch[channel].type)
|
|
{
|
|
case 0:
|
|
flush_rxa (channel);
|
|
break;
|
|
case 1:
|
|
flush_txa (channel);
|
|
break;
|
|
case 31:
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
void setInputSamplerate_main (int channel)
|
|
{
|
|
switch (ch[channel].type)
|
|
{
|
|
case 0:
|
|
setInputSamplerate_rxa (channel);
|
|
break;
|
|
case 1:
|
|
setInputSamplerate_txa (channel);
|
|
break;
|
|
case 31: //
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
void setOutputSamplerate_main (int channel)
|
|
{
|
|
switch (ch[channel].type)
|
|
{
|
|
case 0:
|
|
setOutputSamplerate_rxa (channel);
|
|
break;
|
|
case 1:
|
|
setOutputSamplerate_txa (channel);
|
|
break;
|
|
case 31: //
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
void setDSPSamplerate_main (int channel)
|
|
{
|
|
switch (ch[channel].type)
|
|
{
|
|
case 0:
|
|
setDSPSamplerate_rxa (channel);
|
|
break;
|
|
case 1:
|
|
setDSPSamplerate_txa (channel);
|
|
break;
|
|
case 31: //
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
void setDSPBuffsize_main (int channel)
|
|
{
|
|
switch (ch[channel].type)
|
|
{
|
|
case 0:
|
|
setDSPBuffsize_rxa (channel);
|
|
break;
|
|
case 1:
|
|
setDSPBuffsize_txa (channel);
|
|
break;
|
|
case 31: //
|
|
|
|
break;
|
|
}
|
|
}
|