void quisk_set_tx_mode(void) // called when the mode rxMode is changed { tx_filter(NULL, 0); tx_filter2(NULL, 0); #ifdef TEST_TX_WAV_FILE if (!wavFp) // convenient place to open file open_wav(); #endif }
void CODEC2_WIN32SUPPORT fdmdv_mod(struct FDMDV *fdmdv, COMP tx_fdm[], int tx_bits[], int *sync_bit) { COMP tx_symbols[NC+1]; COMP tx_baseband[NC+1][M]; bits_to_dqpsk_symbols(tx_symbols, fdmdv->prev_tx_symbols, tx_bits, &fdmdv->tx_pilot_bit); memcpy(fdmdv->prev_tx_symbols, tx_symbols, sizeof(COMP)*(NC+1)); tx_filter(tx_baseband, tx_symbols, fdmdv->tx_filter_memory); fdm_upconvert(tx_fdm, tx_baseband, fdmdv->phase_tx, fdmdv->freq); *sync_bit = fdmdv->tx_pilot_bit; }
int quisk_process_microphone(complex * cSamples, int count) { int i, sample, maximum; double d; static double fmPhase = CLIP16; #if 0 // Measure soundcard actual sample rate static time_t seconds = 0; static long total = 0; struct timeb tb; static double dtime; ftime(&tb); total += count; if (seconds == 0) { seconds = tb.time; dtime = tb.time + .001 * tb.millitm; } else if (tb.time - seconds > 4) { printf("Mic soundcard rate %.3f\n", total / (tb.time + .001 * tb.millitm - dtime)); seconds = tb.time; printf("backlog %d, count %d\n", backlog, count); } #endif #ifdef TEST_TX_WAV_FILE get_wav(cSamples, count); // replace audio samples with sound from a WAV file #endif #if USE_GET_SIN get_sin(cSamples, count); // Replace mic samples with a sin wave, and send it #endif maximum = 1; for (i = 0; i < count; i++) { // measure maximum microphone level for display cSamples[i] *= (double)CLIP16 / CLIP32; // convert 32-bit samples to 16 bits d = creal(cSamples[i]); sample = (int)fabs(d); if (sample > maximum) maximum = sample; } if (maximum > mic_level) mic_level = maximum; mic_timer -= count; // time out the max microphone level to display if (mic_timer <= 0) { mic_timer = quisk_sound_state.mic_sample_rate / 1000 * MIC_MAX_HOLD_TIME; mic_max_display = mic_level; mic_level = 1; } if (quisk_is_key_down()) switch (rxMode) { case 2: // LSB case 3: // USB if (spotMode == 0) { tx_filter(cSamples, count); // filter samples transmit_udp(cSamples, count); } else if (spotMode == 1) transmit_mic_carrier(cSamples, count, 0.5); else transmit_mic_carrier(cSamples, count, 1.0); break; case 4: // AM tx_filter2(cSamples, count); for (i = 0; i < count; i++) // transmit (0.5 + ampl/2, 0) cSamples[i] = (creal(cSamples[i]) + CLIP16) * 0.5; transmit_udp(cSamples, count); break; case 5999: // FM tx_filter2(cSamples, count); for (i = 0; i < count; i++) { // transmit +/- 5000 Hz tone fmPhase *= cexp( - I * 2.0 * M_PI * (5000.0 * creal(cSamples[i]) / CLIP16) / quisk_sound_state.mic_sample_rate); cSamples[i] = fmPhase; } transmit_udp(cSamples, count); break; case 10: // transmit IMD 2-tone test transmit_mic_imd(cSamples, count, 1.0); break; case 11: transmit_mic_imd(cSamples, count, 1.0 / sqrt(2.0)); break; case 12: transmit_mic_imd(cSamples, count, 0.5); break; } else fmPhase = CLIP16; return count; }