bool V4LRadioControl::initRadio() { v4l2_tuner tuner; v4l2_input input; v4l2_frequency freq; v4l2_capability cap; low = false; available = false; freqMin = freqMax = currentFreq = 0; fd = ::open("/dev/radio0", O_RDWR); if(fd != -1) { // Capabilities memset( &cap, 0, sizeof( cap ) ); if(::ioctl(fd, VIDIOC_QUERYCAP, &cap ) >= 0) { if(((cap.capabilities & V4L2_CAP_RADIO) == 0) && ((cap.capabilities & V4L2_CAP_AUDIO) == 0)) available = true; } // Tuners memset( &input, 0, sizeof( input ) ); tuners = 0; for ( ;; ) { memset( &input, 0, sizeof( input ) ); input.index = tuners; if ( ioctl( fd, VIDIOC_ENUMINPUT, &input ) < 0 ) break; ++tuners; } // Freq bands for ( int index = 0; index < tuners; ++index ) { memset( &tuner, 0, sizeof( tuner ) ); tuner.index = index; if ( ioctl( fd, VIDIOC_G_TUNER, &tuner ) < 0 ) continue; if ( tuner.type != V4L2_TUNER_RADIO ) continue; if ( ( tuner.capability & V4L2_TUNER_CAP_LOW ) != 0 ) { // Units are 1/16th of a kHz. low = true; } if(low) { freqMin = tuner.rangelow * 62.5; freqMax = tuner.rangehigh * 62.5; } else { freqMin = tuner.rangelow * 62500; freqMax = tuner.rangehigh * 62500; } } // frequency memset( &freq, 0, sizeof( freq ) ); if(::ioctl(fd, VIDIOC_G_FREQUENCY, &freq ) >= 0) { if ( ((int)freq.frequency) != -1 ) { // -1 means not set. if(low) currentFreq = freq.frequency * 62.5; else currentFreq = freq.frequency * 62500; } } // stereo bool stereo = false; memset( &tuner, 0, sizeof( tuner ) ); if ( ioctl( fd, VIDIOC_G_TUNER, &tuner ) >= 0 ) { if((tuner.rxsubchans & V4L2_TUNER_SUB_STEREO) != 0) stereo = true; } vol = getVol(); return true; } m_error = true; emit error(); return false; }
/* 重さを計算 */ double getWeight(double r, double t,double g) { return g * getVol(r,t); }