Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / channel.C
diff --git a/cinelerra-5.1/cinelerra/channel.C b/cinelerra-5.1/cinelerra/channel.C
new file mode 100644 (file)
index 0000000..cf106ba
--- /dev/null
@@ -0,0 +1,241 @@
+
+/*
+ * 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;
+}
+
+void 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();
+}
+
+
+
+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;
+}
+