/** * * playing sound from file * */ int play_wav(char* filename) { int fd; int len=0; int res; char* buf; unsigned long size; Wav* wf; struct stat st; syslog(LOG_INFO, "файл %s\n", filename); res=stat(filename, &st); if(res<0) { syslog(LOG_ERR, "file %s not exist", filename); go_out(); }; len=st.st_size; buf=get_wav(filename, len); if(buf==NULL) { syslog(LOG_ERR, "Error getting file %s", filename); go_out(); }; if(validate_wav(buf)!=0) { syslog(LOG_ERR, "Inappropriate sound file %s", filename); go_out(); }; wf=(Wav*) buf; buf=(char*)&(wf->Data); size=(wf->SubChunk2Size)*(wf->SampleRate)/(wf->ByteRate); syslog(LOG_INFO, "samples: %d", size); play_buffer(buf, size); //drain_sound(); if(munmap(buf, len)!=0) { syslog(LOG_ERR, "Cannot unmap memory used for file %s", filename); //go_out(); }; return(0); }
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; }