wdsp/main.c
Uladzimir Karpenka 89c8a0e2b5 first commit
2026-06-01 15:58:45 +03:00

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;
}
}