void quisk_open_sound(void) // Called from GUI thread { int i; quisk_sound_state.read_error = 0; quisk_sound_state.write_error = 0; quisk_sound_state.underrun_error = 0; quisk_sound_state.mic_read_error = 0; quisk_sound_state.interupts = 0; quisk_sound_state.rate_min = quisk_sound_state.rate_max = -99; quisk_sound_state.chan_min = quisk_sound_state.chan_max = -99; quisk_sound_state.msg1[0] = 0; quisk_sound_state.err_msg[0] = 0; // Set stream names strncpy(Capture.name, quisk_sound_state.dev_capt_name, QUISK_SC_SIZE); strncpy(Playback.name, quisk_sound_state.dev_play_name, QUISK_SC_SIZE); strncpy(MicCapture.name, quisk_sound_state.mic_dev_name, QUISK_SC_SIZE); strncpy(MicPlayback.name, quisk_sound_state.name_of_mic_play, QUISK_SC_SIZE); strncpy(DigitalInput.name, QuiskGetConfigString ("digital_input_name", ""), QUISK_SC_SIZE); strncpy(DigitalOutput.name, QuiskGetConfigString ("digital_output_name", ""), QUISK_SC_SIZE); strncpy(RawSamplePlayback.name, QuiskGetConfigString ("sample_playback_name", ""), QUISK_SC_SIZE); // Set stream descriptions. This is important for "deviceless" drivers like // PulseAudio to be able to distinguish the streams from each other. strncpy(Capture.stream_description, "IQ Input", QUISK_SC_SIZE); Capture.stream_description[QUISK_SC_SIZE-1] = '\0'; strncpy(Playback.stream_description, "Radio Audio Output", QUISK_SC_SIZE); Playback.stream_description[QUISK_SC_SIZE-1] = '\0'; strncpy(MicCapture.stream_description, "Microphone Input", QUISK_SC_SIZE); MicCapture.stream_description[QUISK_SC_SIZE-1] = '\0'; strncpy(MicPlayback.stream_description, "IQ Output", QUISK_SC_SIZE); MicPlayback.stream_description[QUISK_SC_SIZE-1] = '\0'; strncpy(DigitalInput.stream_description, "Digital Input", QUISK_SC_SIZE); strncpy(DigitalOutput.stream_description, "Digital Output", QUISK_SC_SIZE); strncpy(RawSamplePlayback.stream_description, "Raw Sample output", QUISK_SC_SIZE); Playback.sample_rate = quisk_sound_state.playback_rate; // Radio sound play rate MicPlayback.sample_rate = quisk_sound_state.mic_playback_rate; MicCapture.sample_rate = quisk_sound_state.mic_sample_rate; MicCapture.channel_I = quisk_sound_state.mic_channel_I; // Mic audio is here MicCapture.channel_Q = quisk_sound_state.mic_channel_Q; // Capture device for digital modes DigitalInput.sample_rate = 48000; DigitalInput.channel_I = 0; DigitalInput.channel_Q = 1; // Playback device for digital modes digital_output_level = QuiskGetConfigDouble("digital_output_level", 0.7); DigitalOutput.sample_rate = quisk_sound_state.playback_rate; // Radio sound play rate DigitalOutput.channel_I = 0; DigitalOutput.channel_Q = 1; // Playback device for raw samples RawSamplePlayback.sample_rate = quisk_sound_state.sample_rate; RawSamplePlayback.channel_I = 0; RawSamplePlayback.channel_Q = 1; set_num_channels (&Capture); set_num_channels (&Playback); set_num_channels (&MicCapture); set_num_channels (&MicPlayback); set_num_channels (&DigitalInput); set_num_channels (&DigitalOutput); set_num_channels (&RawSamplePlayback); //Needed for pulse audio context connection (KM4DSJ) Capture.stream_dir_record = 1; Playback.stream_dir_record = 0; MicCapture.stream_dir_record = 1; MicPlayback.stream_dir_record= 0; DigitalInput.stream_dir_record = 1; DigitalOutput.stream_dir_record = 0; RawSamplePlayback.stream_dir_record = 0; if (quisk_sound_state.IQ_server[0]) { strncpy(Capture.server, quisk_sound_state.IQ_server, IP_SIZE); strncpy(MicPlayback.server, quisk_sound_state.IQ_server, IP_SIZE); } #ifdef FIX_H101 Capture.channel_Delay = Capture.channel_Q; // Obsolete; do not use. #else Capture.channel_Delay = QuiskGetConfigInt ("channel_delay", -1); #endif MicPlayback.channel_Delay = QuiskGetConfigInt ("tx_channel_delay", -1); if (pt_sample_read) // capture from SDR-IQ by Rf-Space or UDP Capture.name[0] = 0; // zero the capture soundcard name else // sound card capture Capture.sample_rate = quisk_sound_state.sample_rate; // set read size for sound card capture i = (int)(quisk_sound_state.data_poll_usec * 1e-6 * Capture.sample_rate + 0.5); i = i / 64 * 64; if (i > SAMP_BUFFER_SIZE / Capture.num_channels) // limit to buffer size i = SAMP_BUFFER_SIZE / Capture.num_channels; Capture.read_frames = i; MicCapture.read_frames = 0; // Use non-blocking read for microphone Playback.read_frames = 0; MicPlayback.read_frames = 0; // set sound card play latency Playback.latency_frames = Playback.sample_rate * quisk_sound_state.latency_millisecs / 1000; MicPlayback.latency_frames = MicPlayback.sample_rate * quisk_sound_state.latency_millisecs / 1000; Capture.latency_frames = 0; MicCapture.latency_frames = 0; // set capture and playback for digital modes DigitalInput.read_frames = 0; // Use non-blocking read DigitalInput.latency_frames = 0; DigitalOutput.read_frames = 0; DigitalOutput.latency_frames = DigitalOutput.sample_rate * 500 / 1000; // 500 milliseconds // set capture and playback for raw samples RawSamplePlayback.read_frames = 0; RawSamplePlayback.latency_frames = RawSamplePlayback.sample_rate * 500 / 1000; // 500 milliseconds #if DEBUG_IO printf("Sample buffer size %d, latency msec %d\n", SAMP_BUFFER_SIZE, quisk_sound_state.latency_millisecs); #endif }
void quisk_open_sound(void) // Called from GUI thread { int i; quisk_sound_state.read_error = 0; quisk_sound_state.write_error = 0; quisk_sound_state.underrun_error = 0; quisk_sound_state.mic_read_error = 0; quisk_sound_state.interupts = 0; quisk_sound_state.rate_min = quisk_sound_state.rate_max = -99; quisk_sound_state.chan_min = quisk_sound_state.chan_max = -99; quisk_sound_state.msg1[0] = 0; quisk_sound_state.err_msg[0] = 0; strncpy(Capture.name, quisk_sound_state.dev_capt_name, QUISK_SC_SIZE); strncpy(Playback.name, quisk_sound_state.dev_play_name, QUISK_SC_SIZE); strncpy(MicCapture.name, quisk_sound_state.mic_dev_name, QUISK_SC_SIZE); strncpy(MicPlayback.name, quisk_sound_state.name_of_mic_play, QUISK_SC_SIZE); Playback.sample_rate = quisk_sound_state.playback_rate; // Radio sound play rate MicPlayback.sample_rate = quisk_sound_state.mic_playback_rate; MicCapture.sample_rate = quisk_sound_state.mic_sample_rate; MicCapture.channel_I = quisk_sound_state.mic_channel_I; // Mic audio is here MicCapture.channel_Q = quisk_sound_state.mic_channel_Q; // Capture device for digital sound for DGTL strncpy(DigitalInput.name, QuiskGetConfigString ("digital_input_name", ""), QUISK_SC_SIZE); DigitalInput.sample_rate = 48000; DigitalInput.channel_I = 0; DigitalInput.channel_Q = 1; // Playback device for digital sound for DGTL strncpy(DigitalOutput.name, QuiskGetConfigString ("digital_output_name", ""), QUISK_SC_SIZE); DigitalOutput.sample_rate = quisk_sound_state.playback_rate; // Radio sound play rate DigitalOutput.channel_I = 0; DigitalOutput.channel_Q = 1; set_num_channels (&Capture); set_num_channels (&Playback); set_num_channels (&MicCapture); set_num_channels (&MicPlayback); set_num_channels (&DigitalInput); set_num_channels (&DigitalOutput); #ifdef FIX_H101 Capture.channel_Delay = Capture.channel_Q; // Obsolete; do not use. #else Capture.channel_Delay = QuiskGetConfigInt ("channel_delay", -1); #endif MicPlayback.channel_Delay = QuiskGetConfigInt ("tx_channel_delay", -1); if (pt_sample_read) { // capture from SDR-IQ by Rf-Space Capture.name[0] = 0; // zero the capture soundcard name } else if (quisk_using_udp) { // samples from UDP at multiple of 48 kHz Capture.name[0] = 0; // zero the capture soundcard name } else { // sound card capture Capture.sample_rate = quisk_sound_state.sample_rate; } // set read size for sound card capture i = (int)(quisk_sound_state.data_poll_usec * 1e-6 * Capture.sample_rate + 0.5); i = i / 64 * 64; if (i > SAMP_BUFFER_SIZE / Capture.num_channels) // limit to buffer size i = SAMP_BUFFER_SIZE / Capture.num_channels; Capture.read_frames = i; MicCapture.read_frames = 0; // Use non-blocking read for microphone Playback.read_frames = 0; MicPlayback.read_frames = 0; // set sound card play latency Playback.latency_frames = Playback.sample_rate * quisk_sound_state.latency_millisecs / 1000; MicPlayback.latency_frames = MicPlayback.sample_rate * quisk_sound_state.latency_millisecs / 1000; Capture.latency_frames = 0; MicCapture.latency_frames = 0; // set capture and playback for digital mode DGTL DigitalInput.read_frames = 0; // Use non-blocking read DigitalInput.latency_frames = 0; DigitalOutput.read_frames = 0; DigitalOutput.latency_frames = DigitalOutput.sample_rate * 500 / 1000; // 500 milliseconds #if DEBUG_IO printf("Sample buffer size %d, latency msec %d\n", SAMP_BUFFER_SIZE, quisk_sound_state.latency_millisecs); #endif }