diff options
author | FreeArtMan <dos21h@gmail.com> | 2016-05-08 16:02:01 +0100 |
---|---|---|
committer | FreeArtMan <dos21h@gmail.com> | 2016-05-08 16:02:01 +0100 |
commit | e42911405c4bc2f8c097f47d4598baf8522ef3da (patch) | |
tree | 9eb767c5e6a4443e8773b18ea76cf4216f6c8758 /src/hw/sdr.c | |
parent | 9b95088bddcf1f83e3a8f73f08f49b38ecb0f500 (diff) | |
download | radiola-e42911405c4bc2f8c097f47d4598baf8522ef3da.tar.gz radiola-e42911405c4bc2f8c097f47d4598baf8522ef3da.zip |
Diffstat (limited to 'src/hw/sdr.c')
-rw-r--r-- | src/hw/sdr.c | 315 |
1 files changed, 315 insertions, 0 deletions
diff --git a/src/hw/sdr.c b/src/hw/sdr.c new file mode 100644 index 0000000..a9590da --- /dev/null +++ b/src/hw/sdr.c @@ -0,0 +1,315 @@ +#include "sdr.h" + +sdr_t* sdr_init() +{ + sdr_t *sdr=NULL; + + sdr = malloc( sizeof(sdr_t) ); + if (sdr == NULL) + return NULL; + + memset( sdr, 0, sizeof(sdr_t) ); + + return sdr; +} + + +//index of device in oter list +//return inner device list +int sdr_open_device( sdr_t *sdr, int dev_index ) +{ + int ret; + dongle_t *dng=NULL; + rtlsdr_dev_t *rtl=NULL; + + //for now only one device will be supported + if (sdr == NULL) + return -1; + + if (sdr->dongle != NULL) + return -1; + + dng = malloc(sizeof(dongle_t)); + memset(dng, 0, sizeof(dongle_t)); + //set default values for dongle_t + DEF_DONGLE_VALUES(dng); + + ret = hw_open( &rtl, (uint32_t)dev_index ); + if ( ret < 0 ) + { + printf("Cannot open device %02d\n", dev_index ); + goto exit_dng_err; + } + + ret = hw_reset_buffer( rtl ); + if ( ret < 0 ) + { + printf("Couldnt reset buffer\n"); + goto exit_dng_err; + } + + ret = hw_set_sample_rate( rtl, dng->rate ); + if ( ret < 0 ) + { + printf("Couldnt set sample rate to %d\n", dng->rate); + goto exit_dng_err; + } + + ret = hw_set_center_freq( rtl, dng->freq ); + if ( ret < 0 ) + { + printf("Couldnt set frequency %d\n", dng->freq ); + goto exit_dng_err; + } + + ret = hw_set_tuner_gain_mode( rtl, dng->gain ); + if ( ret < 0 ) + { + printf("Cannot set autogain mode\n"); + goto exit_dng_err; + } + + ret = hw_set_agc_mode( rtl, 1 ); + if ( ret < 0 ) + { + printf("Cannot set agc mode\n"); + goto exit_dng_err; + } + + dng->dev_index = dev_index; + dng->dev = rtl; + sdr->dongle = dng; + + return 0; + +exit_dng_err: + free( dng ); + + return -1; +} + + +//associate audio device that going to be used +//int sdr_open_audio( sdr_t *sdr, int dev_index );//?should be just device from list or device name? + + +//get device structure from sdr manager by pluged device num +//dont try to free it muahaha +dongle_t* sdr_get_device_id( sdr_t *sdr, int dev_index) +{ + dongle_t *dng=NULL; + + if ( sdr == NULL ) + return NULL; + + if (sdr->dongle == NULL) + return NULL; + + if (sdr->dongle->dev_index != dev_index) + { + printf("Cannot find device with such device ID\n"); + return NULL; + } + + return sdr->dongle; +} + + + +//get index in list of devices of structure from outer device index +//? do we need? +//int sdr_get_dongle_idx( sdr_t *sdr, int idx ); +//close device by internal list index +int sdr_close_device( sdr_t *sdr, int dev_index ) +{ + if ( sdr == NULL ) + return -1; + + if ( sdr->dongle == NULL ) + { + return -1; + } + + if ( sdr->dongle->dev == NULL ) + return -1; + + if ( sdr->dongle->dev_index != dev_index ) + return -1; + + hw_close( sdr->dongle->dev ); + free( sdr->dongle->dev ); + sdr->dongle->dev = NULL; + + free( sdr->dongle ); + sdr->dongle = NULL; + + return 0; +} + + + +//close sdr +//if there is opened audios then close +//if there is opened devices then close +int sdr_close( sdr_t *sdr ) +{ + if ( sdr != NULL ) + { + if ( sdr->dongle != NULL ) + { + if ( sdr->dongle->dev != NULL ) + { + hw_close( sdr->dongle->dev ); + //all ready free'd by rtlsdr + //free( sdr->dongle->dev ); + sdr->dongle->dev = NULL; + } + free( sdr->dongle ); + sdr->dongle = NULL; + } + free(sdr); + sdr = NULL; + return 0; + } + return -1; +} + + + +//stop any action that associated with dongle +//not yet implemented +int dongle_stop( dongle_t *dongle ) +{ + return -1; +} + + +//int dongle_open( sdr_t *); +//set dongle frequency +int dongle_set_freq( dongle_t *dongle, uint32_t freq) +{ + int ret = 0; + if ( dongle == NULL ) + return -1; + + if ( dongle->dev == NULL ) + return -1; + + ret = hw_set_center_freq( dongle->dev, freq ); + if ( ret < 0 ) + { + printf("Cannot set device frequency to %ud\n", freq); + return -1; + } + + return 0; +} + + +//set gain +int dongle_set_gain( dongle_t *dongle, int gain) +{ + + int ret; + + if ( dongle == NULL ) + return -1; + + if ( dongle->dev == NULL ) + return -1; + + ret = hw_set_tuner_gain_mode( dongle->dev, gain ); + if ( ret < 0 ) + { + printf("Cannot set tunner gain level %d\n", gain ); + return -1; + } + + return 0; +} + + +//set dongle sample rate +int dongle_set_sample_rate( dongle_t *dongle, uint32_t rate ) +{ + int ret; + + if ( dongle == NULL ) + { + return -1; + } + + if ( dongle->dev == NULL ) + return -1; + + ret = hw_set_sample_rate( dongle->dev, rate ); + if ( ret < 0 ) + { + printf("Cannot set sample rate to %uMsps\n", rate); + return -1; + } + + return 0; +} + +int dongle_set_agc( dongle_t *dongle, int mode) +{ + int ret; + + if ( dongle == NULL ) + return -1; + + if ( dongle->dev == NULL ) + return -1; + + //need mode check things + ret = hw_set_agc_mode( dongle->dev, mode ); + if ( ret < 0 ) + { + printf("Cannot set agc gain mode\n"); + return -1; + } + + return 0; +} + + +uint32_t dongle_get_freq( dongle_t *dongle ) +{ + return dongle->freq; +} + + +int dongle_get_gain( dongle_t *dongle ) +{ + return dongle->gain; +} + + +uint32_t dongle_get_sample_rate( dongle_t *dongle ) +{ + return dongle->rate; +} + + +int dongle_read_samples( dongle_t *dongle, uint8_t *buf, int len ) +{ + int ret, read_num; + + if ( dongle == NULL ) + return -1; + + if ( dongle->dev == NULL ) + return -1; + + + + ret = hw_read_sync( dongle->dev, buf, len, &read_num ); + if ( ret < 0 ) + { + printf("Couldnt read samples\n"); + return -1; + } + + return 0; +}
\ No newline at end of file |