#include "audio.h"
#include "new_protocol.h"
+#include "old_protocol.h"
#include "radio.h"
int audio = 0;
break;
}
+ fprintf(stderr,"audio_open_input: mic_buffer_size=%d\n",mic_buffer_size);
i=0;
while(selected[i]!=' ') {
hw[i]=selected[i];
}
hw[i]='\0';
+ fprintf(stderr,"audio_open_input: hw=%s\n",hw);
if ((err = snd_pcm_open (&record_handle, hw, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
fprintf (stderr, "audio_open_input: cannot open audio device %s (%s)\n",
}
static void *mic_read_thread(void *arg) {
- int error;
- if ((error = snd_pcm_prepare (record_handle)) < 0) {
+ int rc;
+ if ((rc = snd_pcm_prepare (record_handle)) < 0) {
fprintf (stderr, "mic_read_thread: cannot prepare audio interface for use (%s)\n",
- snd_strerror (error));
+ snd_strerror (rc));
return;
}
+fprintf(stderr,"mic_read_thread: mic_buffer_size=%d\n",mic_buffer_size);
while(running) {
- if ((error = snd_pcm_readi (record_handle, mic_buffer, mic_buffer_size)) != mic_buffer_size) {
+ if ((rc = snd_pcm_readi (record_handle, mic_buffer, mic_buffer_size)) != mic_buffer_size) {
if(running) {
- fprintf (stderr, "mic_read_thread: read from audio interface failed (%s)\n",
- snd_strerror (error));
- running=FALSE;
+ if(rc<0) {
+ fprintf (stderr, "mic_read_thread: read from audio interface failed (%s)\n",
+ snd_strerror (rc));
+ running=FALSE;
+ } else {
+ fprintf(stderr,"mic_read_thread: read %d",rc);
+ }
}
- break;
} else {
// process the mic input
switch(protocol) {
}
}
}
+fprintf(stderr,"mic_read_thread: exiting\n");
}
// mic gain
double gain=mic_gain;
gain+=(double)pos/100.0;
- if(gain<0.0) {
- gain=0.0;
- } else if(gain>1.0) {
- gain=1.0;
+ if(gain<-10.0) {
+ gain=-10.0;
+ } else if(gain>50.0) {
+ gain=50.0;
}
set_mic_gain(gain);
} else {
}
static void local_audio_cb(GtkWidget *widget, gpointer data) {
- if(local_audio) {
- local_audio=0;
- audio_close_output();
- } else {
+ if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) {
if(audio_open_output()==0) {
local_audio=1;
+ } else {
+ local_audio=0;
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
+ }
+ } else {
+ if(local_audio) {
+ local_audio=0;
+ audio_close_output();
}
}
}
}
static void local_microphone_cb(GtkWidget *widget, gpointer data) {
- if(local_microphone) {
- local_microphone=0;
- audio_close_input();
- } else {
+fprintf(stderr,"local_microphone_cb: %d\n",local_microphone);
+ if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) {
if(audio_open_input()==0) {
local_microphone=1;
+ } else {
+ local_microphone=0;
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
+ }
+ } else {
+ if(local_microphone) {
+ local_microphone=0;
+ audio_close_input();
}
}
}
static void local_input_changed_cb(GtkWidget *widget, gpointer data) {
n_selected_input_device=(int)(long)data;
+fprintf(stderr,"local_input_changed_cb: %d selected=%d\n",local_microphone,n_selected_input_device);
if(local_microphone) {
audio_close_input();
if(audio_open_input()==0) {
}
}
-void *new_protocol_process_local_mic(unsigned char *buffer,int le) {
+void new_protocol_process_local_mic(unsigned char *buffer,int le) {
int b;
int leftmicsample;
int rightmicsample;
if(le) {
leftmicsample = (int)((unsigned char)buffer[b++] & 0xFF);
leftmicsample |= (int)((signed char) buffer[b++]) << 8;
- //rightmicsample = (int)((unsigned char)buffer[b++] & 0xFF);
- //rightmicsample |= (int)((signed char) buffer[b++]) << 8;
rightmicsample=leftmicsample;
} else {
leftmicsample = (int)((signed char) buffer[b++]) << 8;
leftmicsample |= (int)((unsigned char)buffer[b++] & 0xFF);
- rightmicsample = (int)((signed char) buffer[b++]) << 8;
- rightmicsample |= (int)((unsigned char)buffer[b++] & 0xFF);
+ rightmicsample=leftmicsample;
}
#ifdef FREEDV
if(mode==modeFREEDV && isTransmitting()) {
int getTune();
int isTransmitting();
-void *new_protocol_process_local_mic(unsigned char *buffer,int le);
+void new_protocol_process_local_mic(unsigned char *buffer,int le);
#endif
left_sample_double=(double)left_sample/8388607.0; // 24 bit sample 2^23-1
right_sample_double=(double)right_sample/8388607.0; // 24 bit sample 2^23-1
- mic_sample_double=(double)mic_sample/32767.0; // 16 bit sample 2^16-1
+ mic_sample_double = (1.0 / 2147483648.0) * (double)(mic_sample<<16);
// add to buffer
if(isTransmitting() && !local_microphone) {
for(s=0;s<modem_samples;s++) {
for(j=0;j<freedv_divisor;j++) {
mic_sample=mod_out[s];
- mic_sample_double=(double)mic_sample/32767.0f; // 16 bit sample 2^16-1
+ mic_sample_double = (1.0 / 2147483648.0) * (double)(mic_sample<<16);
micinputbuffer[samples*2]=mic_sample_double;
micinputbuffer[(samples*2)+1]=mic_sample_double;
iqinputbuffer[samples*2]=0.0;
}
#endif
} else {
- micinputbuffer[samples*2]=0.0;
- micinputbuffer[(samples*2)+1]=0.0;
- iqinputbuffer[samples*2]=left_sample_double;
- iqinputbuffer[(samples*2)+1]=right_sample_double;
- samples++;
- if(samples==buffer_size) {
- full_rx_buffer();
- samples=0;
+ if(!isTransmitting()) {
+ micinputbuffer[samples*2]=0.0;
+ micinputbuffer[(samples*2)+1]=0.0;
+ iqinputbuffer[samples*2]=left_sample_double;
+ iqinputbuffer[(samples*2)+1]=right_sample_double;
+ samples++;
+ if(samples==buffer_size) {
+ full_rx_buffer();
+ samples=0;
+ }
}
}
}
int error;
double gain=32767.0; // 2^16-1
- // debug
- //int min_sample=0;
- //int max_sample=0;
- //int overflow=0;
-
- fexchange0(CHANNEL_RX0, iqinputbuffer, audiooutputbuffer, &error);
fexchange0(CHANNEL_TX, micinputbuffer, iqoutputbuffer, &error);
+ if(error!=0) {
+ fprintf(stderr,"full_tx_buffer: fexchange0: error=%d\n",error);
+ }
Spectrum0(1, CHANNEL_TX, 0, 0, iqoutputbuffer);
if(radio->device==DEVICE_METIS && atlas_penelope) {
gain=gain*drive;
}
}
-fprintf(stderr,"full_tx_buffer: gain=%f\n",gain);
for(j=0;j<output_buffer_size;j++) {
left_rx_sample=0;
right_rx_sample=0;
left_tx_sample=(int)(iqoutputbuffer[j*2]*gain);
right_tx_sample=(int)(iqoutputbuffer[(j*2)+1]*gain);
-// debug
- //if(left_tx_sample<min_sample) min_sample=left_tx_sample;
- //if(left_tx_sample>max_sample) max_sample=left_tx_sample;
- //if(right_tx_sample<min_sample) min_sample=right_tx_sample;
- //if(right_tx_sample>max_sample) max_sample=right_tx_sample;
-
- if(left_tx_sample>32767) {
- left_tx_sample=32767;
-// overflow++;
- } else if(left_tx_sample<-32767) {
- left_tx_sample=-32767;
-// overflow++;
- }
- if(right_tx_sample>32767) {
- right_tx_sample=32767;
-// overflow++;
- } else if(right_tx_sample<-32767) {
- right_tx_sample=-32767;
-// overflow++;
- }
- output_buffer[output_buffer_index++]=left_rx_sample>>8;
- output_buffer[output_buffer_index++]=left_rx_sample;
- output_buffer[output_buffer_index++]=right_rx_sample>>8;
- output_buffer[output_buffer_index++]=right_rx_sample;
+ output_buffer[output_buffer_index++]=0;
+ output_buffer[output_buffer_index++]=0;
+ output_buffer[output_buffer_index++]=0;
+ output_buffer[output_buffer_index++]=0;
output_buffer[output_buffer_index++]=left_tx_sample>>8;
output_buffer[output_buffer_index++]=left_tx_sample;
output_buffer[output_buffer_index++]=right_tx_sample>>8;
}
-void *old_protocol_process_local_mic(unsigned char *buffer,int le) {
+void old_protocol_process_local_mic(unsigned char *buffer,int le) {
int b;
int leftmicsample;
int rightmicsample;
if(le) {
leftmicsample = (int)((unsigned char)buffer[b++] & 0xFF);
leftmicsample |= (int)((signed char) buffer[b++]) << 8;
- //rightmicsample = (int)((unsigned char)buffer[b++] & 0xFF);
- //rightmicsample |= (int)((signed char) buffer[b++]) << 8;
rightmicsample=leftmicsample;
} else {
leftmicsample = (int)((signed char) buffer[b++]) << 8;
leftmicsample |= (int)((unsigned char)buffer[b++] & 0xFF);
- rightmicsample = (int)((signed char) buffer[b++]) << 8;
- rightmicsample |= (int)((unsigned char)buffer[b++] & 0xFF);
+ rightmicsample=leftmicsample;
}
#ifdef FREEDV
if(mode==modeFREEDV && !tune) {
}
} else {
#endif
+ leftmicsampledouble=(double)leftmicsample/32767.0; // 16 bit sample 2^16-1
if(mode==modeCWL || mode==modeCWU || tune) {
- micinputbuffer[samples*2]=0.0;
- micinputbuffer[(samples*2)+1]=0.0;
- } else {
- micinputbuffer[samples*2]=leftmicsampledouble;
- micinputbuffer[(samples*2)+1]=leftmicsampledouble;
- }
- iqinputbuffer[samples*2]=0.0;
- iqinputbuffer[(samples*2)+1]=0.0;
- samples++;
- if(samples==buffer_size) {
- full_tx_buffer();
- samples=0;
- }
+ micinputbuffer[samples*2]=0.0;
+ micinputbuffer[(samples*2)+1]=0.0;
+ } else {
+ micinputbuffer[samples*2]=leftmicsampledouble;
+ micinputbuffer[(samples*2)+1]=leftmicsampledouble;
+ }
+ iqinputbuffer[samples*2]=0.0;
+ iqinputbuffer[(samples*2)+1]=0.0;
+ samples++;
+ if(samples==buffer_size) {
+ full_tx_buffer();
+ samples=0;
+ }
#ifdef FREEDV
}
#endif
}
+ } else {
+ //fprintf(stderr,"not transmitting - ignore local mic buffer\n");
}
}
break;
case 3:
{
- float d=(float)drive;
+ double d=(double)drive;
if(tune) {
- d=(float)tune_drive;
+ d=(double)tune_drive;
}
int power=0;
if(isTransmitting()) {
BAND *band=band_get_current_band();
- d=d*((float)band->pa_calibration/100.0F);
+ d=d*((double)band->pa_calibration/100.0);
power=(int)(d*255.0);
}
void old_protocol_init(int rx,int pixels);
void old_protocol_new_sample_rate(int rate);
void schedule_frequency_changed();
-void *old_protocol_process_local_mic(unsigned char *buffer,int le);
+void old_protocol_process_local_mic(unsigned char *buffer,int le);
#endif
int toolbar_dialog_buttons=1;
double volume=0.2;
-double mic_gain=0.5;
+double mic_gain=0.0;
int rx_dither=0;
int rx_random=0;
} else {
SetTXAPostGenToneFreq(CHANNEL_TX,(double)cw_keyer_sidetone_frequency);
}
- //SetTXAPostGenToneMag(CHANNEL_TX,0.99999);
- SetTXAPostGenToneMag(CHANNEL_TX,1.0);
+ SetTXAPostGenToneMag(CHANNEL_TX,2.0);
SetTXAPostGenRun(CHANNEL_TX,1);
SetChannelState(CHANNEL_RX0,0,1);
SetChannelState(CHANNEL_TX,1,0);
value=getProperty("tune_drive");
if(value) {tune_drive=atof(value); if(tune_drive>1.0) tune_drive=1.0;}
value=getProperty("mic_gain");
- if(value) { mic_gain=atof(value); if(mic_gain>1.0) mic_gain=1.0; }
+ if(value) { mic_gain=atof(value); if(mic_gain<1.0) mic_gain=0.0; }
value=getProperty("mic_boost");
if(value) mic_boost=atof(value);
value=getProperty("mic_linein");
#include <gtk/gtk.h>
#include <semaphore.h>
#include <stdio.h>
+#include <math.h>
#include "sliders.h"
#include "mode.h"
}
static void micgain_value_changed_cb(GtkWidget *widget, gpointer data) {
- mic_gain=gtk_range_get_value(GTK_RANGE(widget))/100.0;
- SetTXAPanelGain1(CHANNEL_TX,mic_gain);
+ mic_gain=gtk_range_get_value(GTK_RANGE(widget));
+ double gain=pow(10.0, mic_gain / 20.0);
+ SetTXAPanelGain1(CHANNEL_TX,gain);
}
void set_mic_gain(double value) {
mic_gain=value;
- SetTXAPanelGain1(CHANNEL_TX,mic_gain);
+ double gain=pow(10.0, mic_gain / 20.0);
+ SetTXAPanelGain1(CHANNEL_TX,gain);
if(display_sliders) {
- gtk_range_set_value (GTK_RANGE(mic_gain_scale),mic_gain*100.0);
+ gtk_range_set_value (GTK_RANGE(mic_gain_scale),mic_gain);
} else {
if(scale_status!=MIC_GAIN) {
if(scale_status!=NONE) {
}
if(scale_status==NONE) {
scale_status=MIC_GAIN;
- scale_dialog=gtk_dialog_new_with_buttons(mic_linein?"Linein Gain":"Mic Gain",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL);
+ scale_dialog=gtk_dialog_new_with_buttons(mic_linein?"Linein Gain (dB)":"Mic Gain (dB)",GTK_WINDOW(parent_window),GTK_DIALOG_DESTROY_WITH_PARENT,NULL,NULL);
GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(scale_dialog));
- mic_gain_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,0.0, 100.0, 1.00);
+ mic_gain_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,-10.0, 50.0, 1.00);
gtk_widget_set_size_request (mic_gain_scale, 400, 30);
- gtk_range_set_value (GTK_RANGE(mic_gain_scale),mic_gain*100.0);
+ gtk_range_set_value (GTK_RANGE(mic_gain_scale),mic_gain);
gtk_widget_show(mic_gain_scale);
gtk_container_add(GTK_CONTAINER(content),mic_gain_scale);
scale_timer=g_timeout_add(2000,scale_timeout_cb,NULL);
int result=gtk_dialog_run(GTK_DIALOG(scale_dialog));
} else {
g_source_remove(scale_timer);
- gtk_range_set_value (GTK_RANGE(mic_gain_scale),mic_gain*100.0);
+ gtk_range_set_value (GTK_RANGE(mic_gain_scale),mic_gain);
scale_timer=g_timeout_add(2000,scale_timeout_cb,NULL);
}
- mic_gain_label=gtk_label_new(mic_linein?"Linein:":"Mic:");
+ mic_gain_label=gtk_label_new(mic_linein?"Linein (dB):":"Mic (dB):");
//gtk_widget_override_font(mic_gain_label, pango_font_description_from_string("Arial 16"));
gtk_widget_show(mic_gain_label);
gtk_grid_attach(GTK_GRID(sliders),mic_gain_label,0,1,1,1);
- mic_gain_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,0.0, 100.0, 1.0);
- gtk_range_set_value (GTK_RANGE(mic_gain_scale),mic_gain*100.0);
+ mic_gain_scale=gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,-10.0, 50.0, 1.0);
+ gtk_range_set_value (GTK_RANGE(mic_gain_scale),mic_gain);
gtk_widget_show(mic_gain_scale);
gtk_grid_attach(GTK_GRID(sliders),mic_gain_scale,1,1,2,1);
g_signal_connect(G_OBJECT(mic_gain_scale),"value_changed",G_CALLBACK(micgain_value_changed_cb),NULL);
SetRXAANRRun(rx, nr);
SetRXAANFRun(rx, anf);
SetRXASNBARun(rx, snb);
+
+ SetRXAPanelGain1(rx, volume);
}
static void setupTX(int tx) {
SetTXAPostGenToneFreq(tx, 0.0);
SetTXAPostGenRun(tx, 0);
+ SetTXAPanelRun(tx, 1);
+ double gain=pow(10.0, mic_gain / 20.0);
+ SetTXAPanelGain1(tx,gain);
+
//SetChannelState(tx,1,0);
}