private bool ScanProbeFrequency(ChannelTV currentChannelTV, bool needRebuild)
{
this.propertyGridChannel.SelectedObject = currentChannelTV;
Application.DoEvents();
MainForm.videoControl.BackColor = Color.Transparent;
try
{
MainForm.TuneChannel(currentChannelTV, needRebuild);
needRebuild = false;
textBoxScanStatus.Text = Properties.Resources.Scanning;
if (currentChannelTV is ChannelDVB)
{
textBoxScanFrequency.Text = string.Format(Properties.Resources.ScanningFrequency, (currentChannelTV as ChannelDVB).Frequency);
}
else if (currentChannelTV is ChannelAnalogic)
{
textBoxScanFrequency.Text = string.Format(Properties.Resources.ScanningChannel, (currentChannelTV as ChannelAnalogic).Channel);
}
}
catch (Exception ex)
{
Trace.WriteLineIf(MainForm.trace.TraceError, ex.ToString());
textBoxScanStatus.Text = Properties.Resources.Error + " " + ex.Message;
textBoxScanFrequency.Text = Properties.Resources.ScanningError;
MainForm.videoControl.BackColor = MainForm.Settings.VideoBackgroundColor;
}
if (currentChannelTV is ChannelDVB)
{
if (MainForm.GraphBuilder is IBDA)
{
IBDA graphBuilderBDA = MainForm.GraphBuilder as IBDA;
bool locked, present;
int strength, quality;
System.Threading.Thread.Sleep(500);
if ((graphBuilderBDA as ITV).GetSignalStatistics(out locked, out present, out strength, out quality))
{
if (locked && present)
{
IMpeg2Data mpeg2Data = graphBuilderBDA.SectionsAndTables as IMpeg2Data;
short originalNetworkId = -1;
Hashtable serviceNameByServiceId = new Hashtable();
// Hervé Stalin : Ajout d'une hashtable pour le services_type d'un service
Hashtable serviceTypeByServiceID = new Hashtable();
PSISection[] psiSdts = PSISection.GetPSITable((int)PIDS.SDT, (int)TABLE_IDS.SDT_ACTUAL, mpeg2Data);
for (int i = 0; i < psiSdts.Length; i++)
{
PSISection psiSdt = psiSdts[i];
if (psiSdt != null && psiSdt is PSISDT)
{
PSISDT sdt = (PSISDT)psiSdt;
Trace.WriteLineIf(MainForm.trace.TraceVerbose, "PSI Table " + i + "/" + psiSdts.Length + "\r\n");
Trace.WriteLineIf(MainForm.trace.TraceVerbose, sdt.ToString());
originalNetworkId = (short)sdt.OriginalNetworkId;
foreach (PSISDT.Data service in sdt.Services)
{
serviceNameByServiceId[service.ServiceId] = service.GetServiceName();
//Hervé Stalin : remplissage du hashtable du service_type
serviceTypeByServiceID[service.ServiceId] = service.GetServiceType();
}
}
}
//Hervé Stalin : Code pode pour créér un hashtable de lcn
Hashtable logicalChannelNumberByServiceId = new Hashtable();
PSISection[] psiNits = PSISection.GetPSITable((int)PIDS.NIT, (int)TABLE_IDS.NIT_ACTUAL, mpeg2Data);
for (int i = 0; i < psiNits.Length; i++)
{
PSISection psinit = psiNits[i];
if (psinit != null && psinit is PSINIT)
{
PSINIT nit = (PSINIT)psinit;
Trace.WriteLineIf(MainForm.trace.TraceVerbose, "PSI Table " + i + "/" + psiNits.Length + "\r\n");
Trace.WriteLineIf(MainForm.trace.TraceVerbose, nit.ToString());
foreach (PSINIT.Data data in nit.Streams)
{
foreach (PSIDescriptor psiDescriptorData in data.Descriptors)
{
if (psiDescriptorData.DescriptorTag == DESCRIPTOR_TAGS.DESCR_LOGICAL_CHANNEL)
{
PSIDescriptorLogicalChannel psiDescriptorLogicalChannel = (PSIDescriptorLogicalChannel)psiDescriptorData;
foreach (PSIDescriptorLogicalChannel.ChannelNumber f in psiDescriptorLogicalChannel.LogicalChannelNumbers)
{
logicalChannelNumberByServiceId[f.ServiceID] = f.LogicalChannelNumber;
}
}
}
}
}
}
PSISection[] psis = PSISection.GetPSITable((int)PIDS.PAT, (int)TABLE_IDS.PAT, mpeg2Data);
for (int i = 0; i < psis.Length; i++)
{
PSISection psi = psis[i];
if (psi != null && psi is PSIPAT)
{
PSIPAT pat = (PSIPAT)psi;
Trace.WriteLineIf(MainForm.trace.TraceVerbose, "PSI Table " + i + "/" + psis.Length + "\r\n");
Trace.WriteLineIf(MainForm.trace.TraceVerbose, pat.ToString());
ChannelDVB newTemplateChannelDVB = (MainForm.GraphBuilder as ITV).CurrentChannel.MakeCopy() as ChannelDVB;
newTemplateChannelDVB.ONID = originalNetworkId;
newTemplateChannelDVB.TSID = pat.TransportStreamId;
foreach (PSIPAT.Data program in pat.ProgramIds)
{
if (!program.IsNetworkPID) // Hervé Stalin : est encore utile ?
{
//Hervé Stalin: discrimination par le service type
SERVICE_TYPES st;
try
{
st = (SERVICE_TYPES)serviceTypeByServiceID[program.ProgramNumber];
}
catch
{
st = SERVICE_TYPES.DIGITAL_TELEVISION_SERVICE; // bypass en cas de probleme de parsing (mauvaise réception dans mon cas)
}
if (st == SERVICE_TYPES.DIGITAL_TELEVISION_SERVICE || // TV SD MPEG2
st == SERVICE_TYPES.ADVANCE_CODEC_HD_DIGITAL_SERVICE || // TV HD H264
st == SERVICE_TYPES.ADVANCE_CODEC_SD_DIGITAL_SERVICE || // TV SD H264
st == SERVICE_TYPES.MPEG2_HD_DIGITAL_TELEVISION_SERVICE || // TV HD MPEG2
st == SERVICE_TYPES.DIGITAL_RADIO_SOUND_SERVICE || // Radio MP2
st == SERVICE_TYPES.ADVANCED_CODEC_DIGITAL_RADIO_SOUND_SERVICE || // Radio AC3/E-AC3/AAC
st == SERVICE_TYPES.MOSAIC_SERVICE || // Mosaic MPEG2
st == SERVICE_TYPES.ADVANCED_CODEC_MOSAIC_SERVICE) // Mosaic H264
{
ChannelDVB newChannelDVB = newTemplateChannelDVB.MakeCopy() as ChannelDVB;
newChannelDVB.SID = program.ProgramNumber;
newChannelDVB.Name = (string)serviceNameByServiceId[program.ProgramNumber];
//Hervé Stalin: ajout du LCN
newChannelDVB.ChannelNumber = Convert.ToInt16(logicalChannelNumberByServiceId[program.ProgramNumber]);
if (newChannelDVB.Name == null)
{
newChannelDVB.Name = Properties.Resources.NoName;
}
UpdateDVBChannelPids(mpeg2Data, program.Pid, newChannelDVB);
ListViewItem lvi = new ListViewItem(newChannelDVB.Name, "LogoTVDefault");
lvi.SubItems.Add(newChannelDVB.Frequency.ToString());
lvi.SubItems.Add(newChannelDVB.ChannelNumber.ToString());
lvi.Tag = newChannelDVB;
//this.listViewScanResult.SmallImageList = MainForm.imageListLogoTV;
this.listViewScanResult.Items.Add(lvi);
this.buttonScanClear.Enabled = true;
try
{
var extensions = new HashSet <string>(StringComparer.OrdinalIgnoreCase)
{
".gif", ".png", ".jpg", ".jpeg", ".bmp"
};
//var files = Directory.EnumerateFiles(@".\Logos\", "*");
var files = Directory.GetFiles(@".\Logos\", "*");
foreach (var logo in files)
{
string extension = Path.GetExtension(logo).ToLowerInvariant();
if (extensions.Contains(extension))
{
string filename = Path.GetFileNameWithoutExtension(logo).ToLowerInvariant();
if (newChannelDVB.Name.ToLowerInvariant().IndexOf(filename) != -1)
{
newChannelDVB.Logo = logo;
//MainForm.panelChannel.AdjustTVLogo(newChannelDVB);
if (MainForm.imageListLogoTV.Images.ContainsKey(logo))
{
lvi.ImageKey = logo;
}
else
{
try
{
string path = FileUtils.GetAbsolutePath(logo);
if (File.Exists(path))
{
Bitmap bitmap = new Bitmap(path);
//if (!Bitmap.IsAlphaPixelFormat(bitmap.PixelFormat))
// bitmap.MakeTransparent(Color.White);
Image thumbnail = Utils.ResizeImage(bitmap, 16, 16, false);
MainForm.imageListLogoTV.Images.Add(logo, thumbnail);
lvi.ImageKey = logo;
thumbnail.Dispose();
bitmap.Dispose();
break;
}
}
catch (ArgumentException) { }
}
}
}
}
}
catch (Exception)
{
}
//PSISection[] psis2 = PSISection.GetPSITable(program.Pid, (int)TABLE_IDS.PMT, mpeg2Data);
//for (int i2 = 0; i2 < psis2.Length; i2++)
//{
// PSISection psi2 = psis2[i2];
// if (psi2 != null && psi2 is PSIPMT)
// {
// PSIPMT pmt = (PSIPMT)psi2;
// Trace.WriteLineIf(trace.TraceVerbose, "PSI Table " + i2 + "/" + psis2.Length + "\r\n");
// Trace.WriteLineIf(trace.TraceVerbose, pmt.ToString());
// }
//}
}
}
}
Application.DoEvents();
}
}
}
}
}
}
else if (currentChannelTV is ChannelAnalogic)
{
GraphBuilderWDM graphBuilderWDM = MainForm.GraphBuilder as GraphBuilderWDM;
if (graphBuilderWDM.CurrentChannel != null)
{
bool locked, present;
int strength, quality;
if (graphBuilderWDM.GetSignalStatistics(out locked, out present, out strength, out quality))
{
if (locked && present)
{
ChannelAnalogic newChannel = graphBuilderWDM.CurrentChannel.MakeCopy() as ChannelAnalogic;
newChannel.Name = Properties.Resources.NewChannelName + " " + newChannel.Channel.ToString();
ListViewItem lvi = new ListViewItem(newChannel.Name, "LogoTVDefault");
lvi.SubItems.Add(newChannel.Channel.ToString());
lvi.Tag = newChannel;
this.listViewScanResult.Items.Add(lvi);
this.buttonScanClear.Enabled = true;
}
}
}
}
return(needRebuild);
}