예제 #1
0
파일: play.c 프로젝트: oresmelter/rvoice
/**
 *
 * 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);
}
예제 #2
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;
}