X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;ds=sidebyside;f=cinelerra-5.1%2Fcinelerra%2Fchannel.C;fp=cinelerra-5.1%2Fcinelerra%2Fchannel.C;h=cf106ba7521719d7cd2d74aa1ca815ade4c62fc2;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/channel.C b/cinelerra-5.1/cinelerra/channel.C new file mode 100644 index 00000000..cf106ba7 --- /dev/null +++ b/cinelerra-5.1/cinelerra/channel.C @@ -0,0 +1,241 @@ + +/* + * CINELERRA + * Copyright (C) 2008 Adam Williams + * + * 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 + +// 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; +} +