Saltar a contenido

Implementando Sintonización de Radio FM y TV en Aplicaciones Delphi

Introducción a la Sintonización de TV y Radio

Esta guía proporciona ejemplos detallados de implementación para desarrolladores Delphi que trabajan con funcionalidad de sintonización de radio FM y TV. Hemos incluido ejemplos de código equivalentes para C++ MFC y VB6 para soportar necesidades de desarrollo multiplataforma.

Gestión de Dispositivos

Recuperando Sintonizadores de TV Disponibles

El primer paso en implementar funcionalidad de sintonizador es identificar los dispositivos de hardware disponibles:

// Iterar a través de todos los dispositivos de Sintonizador de TV conectados y poblar el desplegable
for I := 0 to VideoCapture1.TVTuner_Devices_GetCount - 1 do
  cbTVTuner.Items.Add(VideoCapture1.TVTuner_Devices_GetItem(i));
// C++ MFC implementación para recuperar dispositivos de Sintonizador de TV
for (int i = 0; i < m_VideoCapture.TVTuner_Devices_GetCount(); i++)
  m_cbTVTuner.AddString(m_VideoCapture.TVTuner_Devices_GetItem(i));
' VB6 implementación para enumeración de dispositivos
For i = 0 To VideoCapture1.TVTuner_Devices_GetCount - 1
  cbTVTuner.AddItem VideoCapture1.TVTuner_Devices_GetItem(i)
Next i

Enumerando Soporte de Formatos de TV

Diferentes regiones usan diferentes estándares de transmisión. Su aplicación debe detectar y manejar estos formatos:

// Cargar formatos de TV disponibles (PAL, NTSC, SECAM, etc.)
for I := 0 to VideoCapture1.TVTuner_TVFormats_GetCount - 1 do
  cbTVSystem.Items.Add(VideoCapture1.TVTuner_TVFormats_GetItem(i));
// C++ MFC - Poblar desplegable de formato de TV con estándares disponibles
for (int i = 0; i < m_VideoCapture.TVTuner_TVFormats_GetCount(); i++)
  m_cbTVSystem.AddString(m_VideoCapture.TVTuner_TVFormats_GetItem(i));
' VB6 - Obtener formatos de TV soportados para el sintonizador seleccionado
For i = 0 To VideoCapture1.TVTuner_TVFormats_GetCount - 1
  cbTVSystem.AddItem VideoCapture1.TVTuner_TVFormats_GetItem(i)
Next i

Configuración Específica por País

Los estándares de transmisión varían por país, por lo que su aplicación debe proporcionar selección de región apropiada:

// Cargar lista de países/regiones para parámetros de sintonización localizados
for I := 0 to VideoCapture1.TVTuner_Countries_GetCount - 1 do
  cbTVCountry.Items.Add(VideoCapture1.TVTuner_Countries_GetItem(i));
// C++ MFC - Construir lista de selección de países para ajustes regionales
for (int i = 0; i < m_VideoCapture.TVTuner_Countries_GetCount(); i++)
  m_cbTVCountry.AddString(m_VideoCapture.TVTuner_Countries_GetItem(i));
' VB6 - Poblar desplegable de países para ajustes de transmisión regional
For i = 0 To VideoCapture1.TVTuner_Countries_GetCount - 1
  cbTVCountry.AddItem VideoCapture1.TVTuner_Countries_GetItem(i)
Next i

Configuración de Dispositivos

Seleccionando un Dispositivo Sintonizador de TV

Una vez que haya enumerado los dispositivos disponibles, los usuarios pueden seleccionar su sintonizador preferido:

// Establecer el dispositivo sintonizador activo basado en la selección del usuario
VideoCapture1.TVTuner_Name := cbTVTuner.Items[cbTVTuner.ItemIndex];
// C++ MFC - Aplicar la selección del dispositivo sintonizador del usuario
CString strText;
m_cbTVTuner.GetLBText(m_cbTVTuner.GetCurSel(), strText);
m_VideoCapture.put_TVTuner_Name(strText);
' VB6 - Establecer sintonizador seleccionado como dispositivo activo
VideoCapture1.TVTuner_Name = cbTVTuner.Text

Leyendo la Configuración Actual del Sintonizador

Después de seleccionar un dispositivo, necesitará leer sus ajustes actuales:

// Inicializar sintonizador y leer configuración actual
VideoCapture1.TVTuner_Read;
// C++ MFC - Cargar ajustes actuales del sintonizador en la aplicación
m_VideoCapture.TVTuner_Read();
' VB6 - Leer configuración del sintonizador después de selección de dispositivo
VideoCapture1.TVTuner_Read

Modos de Operación Disponibles

Los sintonizadores soportan diferentes modos como TV, Radio FM, etc:

// Poblar desplegable de modo de operación con opciones disponibles
for I := 0 to VideoCapture1.TVTuner_Modes_GetCount - 1 do
  cbTVMode.Items.Add(VideoCapture1.TVTuner_Modes_GetItem(i));
// C++ MFC - Obtener modos operacionales soportados para este dispositivo
for (int i = 0; i < m_VideoCapture.TVTuner_Modes_GetCount(); i++)
  m_cbTVMode.AddString(m_VideoCapture.TVTuner_Modes_GetItem(i));
' VB6 - Listar modos de sintonizador disponibles (TV, Radio FM, etc)
For i = 0 To VideoCapture1.TVTuner_Modes_GetCount - 1
  cbTVMode.AddItem VideoCapture1.TVTuner_Modes_GetItem(i)
Next i

Gestión de Frecuencias

Leyendo Frecuencias Actuales

Mostrar las frecuencias de audio y video actuales para proporcionar retroalimentación al usuario:

// Mostrar frecuencias de video y audio actuales en Hz
edVideoFreq.Text := IntToStr(VideoCapture1.TVTuner_VideoFrequency);
edAudiofreq.Text := IntToStr(VideoCapture1.TVTuner_AudioFrequency);
// C++ MFC - Mostrar valores de frecuencia actuales en la interfaz
CString strFreq;
strFreq.Format(_T("%d"), m_VideoCapture.get_TVTuner_VideoFrequency());
m_edVideoFreq.SetWindowText(strFreq);
strFreq.Format(_T("%d"), m_VideoCapture.get_TVTuner_AudioFrequency());
m_edAudioFreq.SetWindowText(strFreq);
' VB6 - Actualizar campos de visualización de frecuencia con valores actuales
edVideoFreq.Text = CStr(VideoCapture1.TVTuner_VideoFrequency)
edAudioFreq.Text = CStr(VideoCapture1.TVTuner_AudioFrequency)

Configuración de Entrada y Modo

Estableciendo Fuente de Señal de Entrada

Los sintonizadores pueden soportar múltiples fuentes de entrada que deben ser configurables:

// Seleccionar la fuente de entrada apropiada basada en la configuración actual
cbTVInput.ItemIndex := cbTVInput.Items.IndexOf(VideoCapture1.TVTuner_InputType);
// C++ MFC - Actualizar selección de fuente de entrada en UI
CString strInputType = m_VideoCapture.get_TVTuner_InputType();
m_cbTVInput.SetCurSel(m_cbTVInput.FindStringExact(-1, strInputType));
' VB6 - Establecer desplegable de fuente de entrada para coincidir con configuración actual
cbTVInput.ListIndex = cbTVInput.FindItem(VideoCapture1.TVTuner_InputType)

Configurando Modo de Operación

Diferentes modos de sintonizador requieren ajustes de UI y parámetros específicos:

// Establecer desplegable de modo de operación al modo actual (TV, Radio FM, etc)
cbTVMode.ItemIndex := cbTVMode.Items.IndexOf(VideoCapture1.TVTuner_Mode);
// C++ MFC - Actualizar selector de modo para coincidir con configuración actual del sintonizador
CString strMode = m_VideoCapture.get_TVTuner_Mode();
m_cbTVMode.SetCurSel(m_cbTVMode.FindStringExact(-1, strMode));
' VB6 - Seleccionar modo de operación actual en desplegable
cbTVMode.ListIndex = cbTVMode.FindItem(VideoCapture1.TVTuner_Mode)

Configuración de Formato de TV

Establecer el estándar de transmisión apropiado para la región:

// Configurar el estándar de TV apropiado (PAL, NTSC, SECAM, etc)
cbTVSystem.ItemIndex := cbTVSystem.Items.IndexOf(VideoCapture1.TVTuner_TVFormat);
// C++ MFC - Establecer desplegable de formato de TV al estándar de transmisión actual
CString strTVFormat = m_VideoCapture.get_TVTuner_TVFormat();
m_cbTVSystem.SetCurSel(m_cbTVSystem.FindStringExact(-1, strTVFormat));
' VB6 - Actualizar selección de formato de sistema de TV
cbTVSystem.ListIndex = cbTVSystem.FindItem(VideoCapture1.TVTuner_TVFormat)

Ajustes Regionales

Configurar parámetros de transmisión específicos de la región:

// Establecer país/región para tablas de frecuencia y estándares apropiados
cbTVCountry.ItemIndex := cbTVCountry.Items.IndexOf(VideoCapture1.TVTuner_Country);
// C++ MFC - Actualizar selección de país para coincidir con ajuste actual
CString strCountry = m_VideoCapture.get_TVTuner_Country();
m_cbTVCountry.SetCurSel(m_cbTVCountry.FindStringExact(-1, strCountry));
' VB6 - Establecer desplegable de país al ajuste regional actual
cbTVCountry.ListIndex = cbTVCountry.FindItem(VideoCapture1.TVTuner_Country)

Escaneo de Canales

Manejando Eventos de Escaneo de Canales

Implementar el manejador de eventos para el proceso de escaneo de canales:

// Manejador de eventos para proceso de escaneo de canales
// Rastrea progreso y recopila canales encontrados
procedure TForm1.VideoCapture1TVTunerTuneChannels(SignalPresent: Boolean; Channel, Frequency, Progress: Integer);
begin
  // Actualizar barra de progreso con progreso de escaneo actual
  pbChannels.Position := Progress;

  // Agregar canal a lista si se detecta señal
  if SignalPresent then
    cbTVChannel.Items.Add(IntToStr(Channel));

  // Escaneo completo cuando Channel = -1
  if Channel = -1 then
    begin
      pbChannels.Position := 0;
      ShowMessage('AutoTune completo');
    end;
end;
// C++ MFC - Implementación de manejador de eventos de escaneo de canales
// En archivo de cabecera (.h)
BEGIN_EVENTSINK_MAP(CMainDlg, CDialog)
    ON_EVENT(CMainDlg, IDC_VIDEOCAPTURE, 1, OnTVTunerTuneChannels, VTS_BOOL VTS_I4 VTS_I4 VTS_I4)
END_EVENTSINK_MAP()

// En archivo de implementación (.cpp)
void CMainDlg::OnTVTunerTuneChannels(BOOL SignalPresent, long Channel, long Frequency, long Progress)
{
    // Actualizar indicador de progreso de escaneo
    m_pbChannels.SetPos(Progress);

    // Agregar canales encontrados a la lista de selección
    if (SignalPresent)
    {
        CString strChannel;
        strChannel.Format(_T("%d"), Channel);
        m_cbTVChannel.AddString(strChannel);
    }

    // Manejar finalización de escaneo
    if (Channel == -1)
    {
        m_pbChannels.SetPos(0);
        MessageBox(_T("AutoTune completo"), _T("Información"), MB_OK | MB_ICONINFORMATION);
    }
}
' VB6 - Manejador de eventos de escaneo de canales
Private Sub VideoCapture1_TVTunerTuneChannels(ByVal SignalPresent As Boolean, ByVal Channel As Long, ByVal Frequency As Long, ByVal Progress As Long)
    ' Actualizar visualización de progreso de escaneo
    pbChannels.Value = Progress

    ' Agregar canal a lista cuando se encuentra señal
    If SignalPresent Then
        cbTVChannel.AddItem CStr(Channel)
    End If

    ' Manejar finalización de escaneo
    If Channel = -1 Then
        pbChannels.Value = 0
        MsgBox "AutoTune completo", vbInformation
    End If
End Sub

Iniciando Escaneo de Canales

Iniciar el proceso de escaneo automático de canales:

// Definir constantes de frecuencia para claridad
const KHz = 1000;
const MHz = 1000000;

// Inicializar sintonizador con ajustes actuales
VideoCapture1.TVTuner_Read;
// Limpiar lista de canales anterior
cbTVChannel.Items.Clear;

// Configurar parámetros especiales para escaneo de Radio FM
if ( (cbTVMode.ItemIndex <> -1) and (cbTVMode.Items[cbTVMode.ItemIndex] = 'FM Radio') ) then
  begin
    // Establecer rango de frecuencia para escaneo FM (100-110MHz)
    VideoCapture1.TVTuner_FM_Tuning_StartFrequency := 100 * Mhz;
    VideoCapture1.TVTuner_FM_Tuning_StopFrequency := 110 * MHz;
    // Establecer incrementos de 100KHz para escaneo FM
    VideoCapture1.TVTuner_FM_Tuning_Step := 100 * KHz;
  end;

// Iniciar escaneo automático de canales
VideoCapture1.TVTuner_TuneChannels_Start;
// C++ MFC - Iniciar escaneo de canales con parámetros apropiados
const int KHz = 1000;
const int MHz = 1000000;

// Actualizar configuración del sintonizador
m_VideoCapture.TVTuner_Read();
// Restablecer lista de canales antes de escanear
m_cbTVChannel.ResetContent();

// Configurar parámetros específicos de FM si está en modo radio
CString strMode;
m_cbTVMode.GetLBText(m_cbTVMode.GetCurSel(), strMode);
if (strMode == _T("FM Radio"))
{
    // Establecer rango de escaneo FM (100-110MHz)
    m_VideoCapture.put_TVTuner_FM_Tuning_StartFrequency(100 * MHz);
    m_VideoCapture.put_TVTuner_FM_Tuning_StopFrequency(110 * MHz);
    // Usar pasos de 100KHz para escaneo FM
    m_VideoCapture.put_TVTuner_FM_Tuning_Step(100 * KHz);
}

// Iniciar el proceso de escaneo de canales
m_VideoCapture.TVTuner_TuneChannels_Start();
' VB6 - Iniciar proceso de escaneo de canales
Const KHz = 1000
Const MHz = 1000000

' Leer configuración actual del sintonizador
VideoCapture1.TVTuner_Read
' Limpiar lista de canales existente
cbTVChannel.Clear

' Configuración especial para escaneo de Radio FM
If (cbTVMode.ListIndex <> -1) And (cbTVMode.Text = "FM Radio") Then
    ' Establecer parámetros de escaneo de banda FM (100-110MHz)
    VideoCapture1.TVTuner_FM_Tuning_StartFrequency = 100 * MHz
    VideoCapture1.TVTuner_FM_Tuning_StopFrequency = 110 * MHz
    ' Usar tamaño de paso de 100KHz para escaneo FM
    VideoCapture1.TVTuner_FM_Tuning_Step = 100 * KHz
End If

' Iniciar escaneo automático de canales
VideoCapture1.TVTuner_TuneChannels_Start

Operaciones de Sintonización Manual

Estableciendo Canal por Número

Permitir selección directa de canal por número:

// Cambiar al número de canal especificado
VideoCapture1.TVTuner_Channel := StrToInt(edChannel.Text);
// Aplicar cambios de sintonización
VideoCapture1.TVTuner_Apply;
// C++ MFC - Establecer sintonizador al número de canal especificado
CString strChannel;
m_edChannel.GetWindowText(strChannel);
m_VideoCapture.put_TVTuner_Channel(_ttoi(strChannel));
m_VideoCapture.TVTuner_Apply();
' VB6 - Sintonizar a número de canal específico
VideoCapture1.TVTuner_Channel = CInt(edChannel.Text)
VideoCapture1.TVTuner_Apply

Estableciendo Frecuencia de Radio Directamente

Para radio FM, la sintonización directa de frecuencia es a menudo requerida:

// Establecer canal a -1 para sintonización basada en frecuencia
VideoCapture1.TVTuner_Channel := -1; // debe ser -1 para usar frecuencia
// Establecer frecuencia específica desde campo de entrada
VideoCapture1.TVTuner_Frequency := StrToInt(edChannel.Text);
// Aplicar cambio de frecuencia
VideoCapture1.TVTuner_Apply;
// C++ MFC - Implementación de sintonización directa de frecuencia
CString strFrequency;
m_edChannel.GetWindowText(strFrequency);
// Establecer canal a -1 para habilitar sintonización basada en frecuencia
m_VideoCapture.put_TVTuner_Channel(-1); // debe ser -1 para usar frecuencia
// Aplicar la frecuencia especificada
m_VideoCapture.put_TVTuner_Frequency(_ttoi(strFrequency));
m_VideoCapture.TVTuner_Apply();
' VB6 - Sintonización manual de frecuencia para radio
VideoCapture1.TVTuner_Channel = -1 ' debe ser -1 para usar frecuencia
VideoCapture1.TVTuner_Frequency = CInt(edChannel.Text)
VideoCapture1.TVTuner_Apply

Conclusión

Esta guía cubre los aspectos esenciales de implementar funcionalidad de sintonización de radio FM y TV en sus aplicaciones Delphi. Siguiendo estos ejemplos, puede crear interfaces de sintonización robustas con escaneo de canales apropiado, gestión de frecuencias y detección de señal.

Para una integración óptima en sus proyectos, recuerde manejar condiciones de error y proporcionar retroalimentación apropiada al usuario durante operaciones prolongadas como el escaneo de canales.


Por favor visite nuestra página de GitHub para ejemplos de código adicionales y ejemplos de implementación.