+++ /dev/null
-
-/*
- * CINELERRA
- * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "channel.h"
-#include "bchash.h"
-#include "filexml.h"
-#include <string.h>
-
-// Channel table entry for the TV tuner
-
-Channel::Channel()
-{
- reset();
-}
-
-Channel::Channel(Channel *channel)
-{
- copy_settings(channel);
- copy_usage(channel);
-}
-
-Channel::~Channel()
-{
-}
-
-
-void Channel::reset()
-{
-// GUI options
- use_frequency = 0;
- use_fine = 0;
- use_norm = 0;
- use_input = 0;
-
- title[0] = 0;
- device_name[0] = 0;
- entry = 0;
- element = 0;
- freqtable = 0;
- fine_tune = 0;
- input = 0;
- norm = 0;
- device_index = 0;
- tuner = 0;
- has_scanning = 0;
- has_subchan = 0;
-
- audio_stream = 0;
- video_stream = 0;
- audio_pid = 0x14;
- video_pid = 0x11;
-}
-
-void Channel::dump()
-{
- printf("Channel::dump title=%s\n"
- "device_name=%s\n"
- "use_freq=%d\n"
- "use_fine=%d\n"
- "use_norm=%d\n"
- "use_input=%d\n"
- "has_scanning=%d\n"
- "has_subchan=%d\n",
- title,
- device_name,
- use_frequency,
- use_fine,
- use_norm,
- use_input,
- has_scanning,
- has_subchan);
-}
-
-Channel& Channel::operator=(Channel &channel)
-{
- printf("Channel::operator= is not supported.\n");
- return *this;
-}
-
-bool Channel::operator==(Channel &channel)
-{
- if( this == &channel ) return true;
- return this->entry != channel.entry ||
- this->element != channel.element ||
- this->freqtable != channel.freqtable ||
- this->fine_tune != channel.fine_tune ||
- this->input != channel.input ||
- this->norm != channel.norm ||
- this->device_index != channel.device_index ||
- this->tuner != channel.tuner ||
- this->audio_stream != channel.audio_stream ||
- this->video_stream != channel.video_stream ||
- this->audio_pid != channel.audio_pid ||
- this->video_pid != channel.video_pid ? false : true;
-}
-
-bool Channel::operator!=(Channel &channel)
-{
- return *this == channel ? false : true;
-}
-
-void Channel::copy_settings(Channel *channel)
-{
- strcpy(this->title, channel->title);
- this->entry = channel->entry;
- this->element = channel->element;
- this->freqtable = channel->freqtable;
- this->fine_tune = channel->fine_tune;
- this->input = channel->input;
- this->norm = channel->norm;
- this->device_index = channel->device_index;
- this->tuner = channel->tuner;
- this->audio_stream = channel->audio_stream;
- this->video_stream = channel->video_stream;
- this->audio_pid = channel->audio_pid;
- this->video_pid = channel->video_pid;
-}
-
-void Channel::copy_usage(Channel *channel)
-{
- this->use_frequency = channel->use_frequency;
- this->use_fine = channel->use_fine;
- this->use_norm = channel->use_norm;
- this->use_input = channel->use_input;
- this->has_scanning = channel->has_scanning;
- this->has_subchan = channel->has_subchan;
-}
-
-int Channel::load(FileXML *file)
-{
- int done = 0;
- char *text;
-
-
- while(!done)
- {
- done = file->read_tag();
- if(!done)
- {
- if(file->tag.title_is("CHANNEL"))
- {
- entry = file->tag.get_property("ENTRY", entry);
- element = file->tag.get_property("ELEMENT", element);
- freqtable = file->tag.get_property("FREQTABLE", freqtable);
- fine_tune = file->tag.get_property("FINE_TUNE", fine_tune);
- input = file->tag.get_property("INPUT", input);
- norm = file->tag.get_property("NORM", norm);
- device_index = file->tag.get_property("DEVICE_INDEX", device_index);
- tuner = file->tag.get_property("TUNER", tuner);
- audio_stream = file->tag.get_property("AUDIO_STREAM", audio_pid);
- video_stream = file->tag.get_property("VIDEO_STREAM", video_pid);
- audio_pid = file->tag.get_property("AUDIO_PID", audio_pid);
- video_pid = file->tag.get_property("VIDEO_PID", video_pid);
- text = file->read_text();
- strcpy(title, text);
- }
- else
- if(file->tag.title_is("/CHANNEL"))
- return 0;
- }
- }
- return done;
-}
-
-int Channel::save(FileXML *file)
-{
- file->tag.set_title("CHANNEL");
- file->tag.set_property("ENTRY", entry);
- file->tag.set_property("ELEMENT", element);
- file->tag.set_property("FREQTABLE", freqtable);
- file->tag.set_property("FINE_TUNE", fine_tune);
- file->tag.set_property("INPUT", input);
- file->tag.set_property("NORM", norm);
- file->tag.set_property("DEVICE_INDEX", device_index);
- file->tag.set_property("TUNER", tuner);
- file->tag.set_property("AUDIO_STREAM", audio_stream);
- file->tag.set_property("VIDEO_STREAM", video_stream);
- file->tag.set_property("AUDIO_PID", audio_pid);
- file->tag.set_property("VIDEO_PID", video_pid);
- file->append_tag();
- file->append_text(title);
- file->tag.set_title("/CHANNEL");
- file->append_tag();
- file->append_newline();
- return 0;
-}
-
-
-
-void Channel::load_defaults(BC_Hash *defaults)
-{
- freqtable = defaults->get("SCAN_FREQTABLE", freqtable);
- input = defaults->get("SCAN_INPUT", input);
- norm = defaults->get("SCAN_NORM", norm);
-}
-
-void Channel::save_defaults(BC_Hash *defaults)
-{
- defaults->update("SCAN_FREQTABLE", freqtable);
- defaults->update("SCAN_INPUT", input);
- defaults->update("SCAN_NORM", norm);
-}
-
-static inline bool is_numeric(char c) { return (c>='0' && c<='9'); }
-static inline bool is_separator(char c) { return (c=='.' || c=='-'); }
-
-static inline void get_chan(const char *p, int &ch, int &sub)
-{
- while( *p == ' ' ) ++p;
- for( ch=0,sub=1; is_numeric(*p); ++p ) ch = ch*10 + *p-'0';
- if( !*p || !is_separator(*p) || !is_numeric(*++p) ) return;
- for( sub=*p-'0'; is_numeric(*++p); ) sub = sub*10 + *p-'0';
-}
-
-int Channel::cstrcmp(const char *name)
-{
- if( !strcmp(name, title) ) return 0;
- int ch1, sub1; get_chan(name, ch1, sub1);
- int ch2, sub2; get_chan(title, ch2, sub2);
- int ret = ch1 - ch2;
- if( !ret ) ret = sub1 - sub2;
- return ret;
-}
-