mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Changed 'cStatusMonitor' to 'cStatus'
This commit is contained in:
		
							
								
								
									
										2
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -1319,7 +1319,7 @@ Video Disk Recorder Revision History | ||||
|   accessed (suggested by Stefan Huelswitt). | ||||
| - Rearranged OSD class names to make 'cOsd' available for the main OSD interface. | ||||
| - Completely moved OSD handling out of the cDvbApi class, into the new cOsd. | ||||
| - Implemented cStatusMonitor to allow plugins to set up a status monitor. | ||||
| - Implemented cStatus to allow plugins to set up a status monitor. | ||||
|   See PLUGINS.html for details. | ||||
| - Moved the cEITScanner out of dvbapi.h/.c, into the new eitscan.h/.c. | ||||
| - Added Swedish language texts (thanks to Tomas Prybil). | ||||
|   | ||||
							
								
								
									
										10
									
								
								PLUGINS.html
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								PLUGINS.html
									
									
									
									
									
								
							| @@ -857,12 +857,12 @@ plugin's name, and <tt>0.0.1</tt> will be your plugin's current version number. | ||||
| <center><i><b>A piece of the action</b></i></center><p> | ||||
|  | ||||
| If a plugin wants to get informed on various events in VDR, it can derive a class from | ||||
| <tt>cStatusMonitor</tt>, as in | ||||
| <tt>cStatus</tt>, as in | ||||
|  | ||||
| <p><table><tr><td bgcolor=#F0F0F0><pre><br> | ||||
| #include <vdr/status.h> | ||||
|  | ||||
| class cMyStatusMonitor : public cStatusMonitor { | ||||
| class cMyStatusMonitor : public cStatus { | ||||
| protected: | ||||
|   virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber); | ||||
|   }; | ||||
| @@ -914,15 +914,15 @@ Note that the actual object is created in the <tt>Start()</tt> function, not in | ||||
| constructor! It is also important to delete the object in the destructor, in order to | ||||
| avoid memory leaks. | ||||
| <p> | ||||
| A Plugin can implement any number of <tt>cStatusMonitor</tt> derived objects, and once | ||||
| A Plugin can implement any number of <tt>cStatus</tt> derived objects, and once | ||||
| the plugin has been started it may create and delete them as necessary. | ||||
| No further action apart from creating an object derived from <tt>cStatusMonitor</tt> | ||||
| No further action apart from creating an object derived from <tt>cStatus</tt> | ||||
| is necessary. VDR will automatically hook it into a list of status monitors, with | ||||
| their individual virtual member functions being called in the same sequence as the | ||||
| objects were created. | ||||
| <p> | ||||
| See the file <tt>status.h</tt> for detailed information on which status monitor | ||||
| member functions are available in <tt>cStatusMonitor</tt>. You only need to implement | ||||
| member functions are available in <tt>cStatus</tt>. You only need to implement | ||||
| the functions you actually want to use. | ||||
| <!--X1.1.3--></td></tr></table> | ||||
|  | ||||
|   | ||||
							
								
								
									
										340
									
								
								PLUGINS/src/status/COPYING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								PLUGINS/src/status/COPYING
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,340 @@ | ||||
| 		    GNU GENERAL PUBLIC LICENSE | ||||
| 		       Version 2, June 1991 | ||||
|  | ||||
|  Copyright (C) 1989, 1991 Free Software Foundation, Inc. | ||||
|                        59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
| 			    Preamble | ||||
|  | ||||
|   The licenses for most software are designed to take away your | ||||
| freedom to share and change it.  By contrast, the GNU General Public | ||||
| License is intended to guarantee your freedom to share and change free | ||||
| software--to make sure the software is free for all its users.  This | ||||
| General Public License applies to most of the Free Software | ||||
| Foundation's software and to any other program whose authors commit to | ||||
| using it.  (Some other Free Software Foundation software is covered by | ||||
| the GNU Library General Public License instead.)  You can apply it to | ||||
| your programs, too. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| this service if you wish), that you receive source code or can get it | ||||
| if you want it, that you can change the software or use pieces of it | ||||
| in new free programs; and that you know you can do these things. | ||||
|  | ||||
|   To protect your rights, we need to make restrictions that forbid | ||||
| anyone to deny you these rights or to ask you to surrender the rights. | ||||
| These restrictions translate to certain responsibilities for you if you | ||||
| distribute copies of the software, or if you modify it. | ||||
|  | ||||
|   For example, if you distribute copies of such a program, whether | ||||
| gratis or for a fee, you must give the recipients all the rights that | ||||
| you have.  You must make sure that they, too, receive or can get the | ||||
| source code.  And you must show them these terms so they know their | ||||
| rights. | ||||
|  | ||||
|   We protect your rights with two steps: (1) copyright the software, and | ||||
| (2) offer you this license which gives you legal permission to copy, | ||||
| distribute and/or modify the software. | ||||
|  | ||||
|   Also, for each author's protection and ours, we want to make certain | ||||
| that everyone understands that there is no warranty for this free | ||||
| software.  If the software is modified by someone else and passed on, we | ||||
| want its recipients to know that what they have is not the original, so | ||||
| that any problems introduced by others will not reflect on the original | ||||
| authors' reputations. | ||||
|  | ||||
|   Finally, any free program is threatened constantly by software | ||||
| patents.  We wish to avoid the danger that redistributors of a free | ||||
| program will individually obtain patent licenses, in effect making the | ||||
| program proprietary.  To prevent this, we have made it clear that any | ||||
| patent must be licensed for everyone's free use or not licensed at all. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
| 		    GNU GENERAL PUBLIC LICENSE | ||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||
|  | ||||
|   0. This License applies to any program or other work which contains | ||||
| a notice placed by the copyright holder saying it may be distributed | ||||
| under the terms of this General Public License.  The "Program", below, | ||||
| refers to any such program or work, and a "work based on the Program" | ||||
| means either the Program or any derivative work under copyright law: | ||||
| that is to say, a work containing the Program or a portion of it, | ||||
| either verbatim or with modifications and/or translated into another | ||||
| language.  (Hereinafter, translation is included without limitation in | ||||
| the term "modification".)  Each licensee is addressed as "you". | ||||
|  | ||||
| Activities other than copying, distribution and modification are not | ||||
| covered by this License; they are outside its scope.  The act of | ||||
| running the Program is not restricted, and the output from the Program | ||||
| is covered only if its contents constitute a work based on the | ||||
| Program (independent of having been made by running the Program). | ||||
| Whether that is true depends on what the Program does. | ||||
|  | ||||
|   1. You may copy and distribute verbatim copies of the Program's | ||||
| source code as you receive it, in any medium, provided that you | ||||
| conspicuously and appropriately publish on each copy an appropriate | ||||
| copyright notice and disclaimer of warranty; keep intact all the | ||||
| notices that refer to this License and to the absence of any warranty; | ||||
| and give any other recipients of the Program a copy of this License | ||||
| along with the Program. | ||||
|  | ||||
| You may charge a fee for the physical act of transferring a copy, and | ||||
| you may at your option offer warranty protection in exchange for a fee. | ||||
|  | ||||
|   2. You may modify your copy or copies of the Program or any portion | ||||
| of it, thus forming a work based on the Program, and copy and | ||||
| distribute such modifications or work under the terms of Section 1 | ||||
| above, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) You must cause the modified files to carry prominent notices | ||||
|     stating that you changed the files and the date of any change. | ||||
|  | ||||
|     b) You must cause any work that you distribute or publish, that in | ||||
|     whole or in part contains or is derived from the Program or any | ||||
|     part thereof, to be licensed as a whole at no charge to all third | ||||
|     parties under the terms of this License. | ||||
|  | ||||
|     c) If the modified program normally reads commands interactively | ||||
|     when run, you must cause it, when started running for such | ||||
|     interactive use in the most ordinary way, to print or display an | ||||
|     announcement including an appropriate copyright notice and a | ||||
|     notice that there is no warranty (or else, saying that you provide | ||||
|     a warranty) and that users may redistribute the program under | ||||
|     these conditions, and telling the user how to view a copy of this | ||||
|     License.  (Exception: if the Program itself is interactive but | ||||
|     does not normally print such an announcement, your work based on | ||||
|     the Program is not required to print an announcement.) | ||||
|  | ||||
| These requirements apply to the modified work as a whole.  If | ||||
| identifiable sections of that work are not derived from the Program, | ||||
| and can be reasonably considered independent and separate works in | ||||
| themselves, then this License, and its terms, do not apply to those | ||||
| sections when you distribute them as separate works.  But when you | ||||
| distribute the same sections as part of a whole which is a work based | ||||
| on the Program, the distribution of the whole must be on the terms of | ||||
| this License, whose permissions for other licensees extend to the | ||||
| entire whole, and thus to each and every part regardless of who wrote it. | ||||
|  | ||||
| Thus, it is not the intent of this section to claim rights or contest | ||||
| your rights to work written entirely by you; rather, the intent is to | ||||
| exercise the right to control the distribution of derivative or | ||||
| collective works based on the Program. | ||||
|  | ||||
| In addition, mere aggregation of another work not based on the Program | ||||
| with the Program (or with a work based on the Program) on a volume of | ||||
| a storage or distribution medium does not bring the other work under | ||||
| the scope of this License. | ||||
|  | ||||
|   3. You may copy and distribute the Program (or a work based on it, | ||||
| under Section 2) in object code or executable form under the terms of | ||||
| Sections 1 and 2 above provided that you also do one of the following: | ||||
|  | ||||
|     a) Accompany it with the complete corresponding machine-readable | ||||
|     source code, which must be distributed under the terms of Sections | ||||
|     1 and 2 above on a medium customarily used for software interchange; or, | ||||
|  | ||||
|     b) Accompany it with a written offer, valid for at least three | ||||
|     years, to give any third party, for a charge no more than your | ||||
|     cost of physically performing source distribution, a complete | ||||
|     machine-readable copy of the corresponding source code, to be | ||||
|     distributed under the terms of Sections 1 and 2 above on a medium | ||||
|     customarily used for software interchange; or, | ||||
|  | ||||
|     c) Accompany it with the information you received as to the offer | ||||
|     to distribute corresponding source code.  (This alternative is | ||||
|     allowed only for noncommercial distribution and only if you | ||||
|     received the program in object code or executable form with such | ||||
|     an offer, in accord with Subsection b above.) | ||||
|  | ||||
| The source code for a work means the preferred form of the work for | ||||
| making modifications to it.  For an executable work, complete source | ||||
| code means all the source code for all modules it contains, plus any | ||||
| associated interface definition files, plus the scripts used to | ||||
| control compilation and installation of the executable.  However, as a | ||||
| special exception, the source code distributed need not include | ||||
| anything that is normally distributed (in either source or binary | ||||
| form) with the major components (compiler, kernel, and so on) of the | ||||
| operating system on which the executable runs, unless that component | ||||
| itself accompanies the executable. | ||||
|  | ||||
| If distribution of executable or object code is made by offering | ||||
| access to copy from a designated place, then offering equivalent | ||||
| access to copy the source code from the same place counts as | ||||
| distribution of the source code, even though third parties are not | ||||
| compelled to copy the source along with the object code. | ||||
|  | ||||
|   4. You may not copy, modify, sublicense, or distribute the Program | ||||
| except as expressly provided under this License.  Any attempt | ||||
| otherwise to copy, modify, sublicense or distribute the Program is | ||||
| void, and will automatically terminate your rights under this License. | ||||
| However, parties who have received copies, or rights, from you under | ||||
| this License will not have their licenses terminated so long as such | ||||
| parties remain in full compliance. | ||||
|  | ||||
|   5. You are not required to accept this License, since you have not | ||||
| signed it.  However, nothing else grants you permission to modify or | ||||
| distribute the Program or its derivative works.  These actions are | ||||
| prohibited by law if you do not accept this License.  Therefore, by | ||||
| modifying or distributing the Program (or any work based on the | ||||
| Program), you indicate your acceptance of this License to do so, and | ||||
| all its terms and conditions for copying, distributing or modifying | ||||
| the Program or works based on it. | ||||
|  | ||||
|   6. Each time you redistribute the Program (or any work based on the | ||||
| Program), the recipient automatically receives a license from the | ||||
| original licensor to copy, distribute or modify the Program subject to | ||||
| these terms and conditions.  You may not impose any further | ||||
| restrictions on the recipients' exercise of the rights granted herein. | ||||
| You are not responsible for enforcing compliance by third parties to | ||||
| this License. | ||||
|  | ||||
|   7. If, as a consequence of a court judgment or allegation of patent | ||||
| infringement or for any other reason (not limited to patent issues), | ||||
| conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot | ||||
| distribute so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you | ||||
| may not distribute the Program at all.  For example, if a patent | ||||
| license would not permit royalty-free redistribution of the Program by | ||||
| all those who receive copies directly or indirectly through you, then | ||||
| the only way you could satisfy both it and this License would be to | ||||
| refrain entirely from distribution of the Program. | ||||
|  | ||||
| If any portion of this section is held invalid or unenforceable under | ||||
| any particular circumstance, the balance of the section is intended to | ||||
| apply and the section as a whole is intended to apply in other | ||||
| circumstances. | ||||
|  | ||||
| It is not the purpose of this section to induce you to infringe any | ||||
| patents or other property right claims or to contest validity of any | ||||
| such claims; this section has the sole purpose of protecting the | ||||
| integrity of the free software distribution system, which is | ||||
| implemented by public license practices.  Many people have made | ||||
| generous contributions to the wide range of software distributed | ||||
| through that system in reliance on consistent application of that | ||||
| system; it is up to the author/donor to decide if he or she is willing | ||||
| to distribute software through any other system and a licensee cannot | ||||
| impose that choice. | ||||
|  | ||||
| This section is intended to make thoroughly clear what is believed to | ||||
| be a consequence of the rest of this License. | ||||
|  | ||||
|   8. If the distribution and/or use of the Program is restricted in | ||||
| certain countries either by patents or by copyrighted interfaces, the | ||||
| original copyright holder who places the Program under this License | ||||
| may add an explicit geographical distribution limitation excluding | ||||
| those countries, so that distribution is permitted only in or among | ||||
| countries not thus excluded.  In such case, this License incorporates | ||||
| the limitation as if written in the body of this License. | ||||
|  | ||||
|   9. The Free Software Foundation may publish revised and/or new versions | ||||
| of the General Public License from time to time.  Such new versions will | ||||
| be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
| Each version is given a distinguishing version number.  If the Program | ||||
| specifies a version number of this License which applies to it and "any | ||||
| later version", you have the option of following the terms and conditions | ||||
| either of that version or of any later version published by the Free | ||||
| Software Foundation.  If the Program does not specify a version number of | ||||
| this License, you may choose any version ever published by the Free Software | ||||
| Foundation. | ||||
|  | ||||
|   10. If you wish to incorporate parts of the Program into other free | ||||
| programs whose distribution conditions are different, write to the author | ||||
| to ask for permission.  For software which is copyrighted by the Free | ||||
| Software Foundation, write to the Free Software Foundation; we sometimes | ||||
| make exceptions for this.  Our decision will be guided by the two goals | ||||
| of preserving the free status of all derivatives of our free software and | ||||
| of promoting the sharing and reuse of software generally. | ||||
|  | ||||
| 			    NO WARRANTY | ||||
|  | ||||
|   11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | ||||
| FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN | ||||
| OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | ||||
| PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | ||||
| OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||||
| MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS | ||||
| TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE | ||||
| PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | ||||
| REPAIR OR CORRECTION. | ||||
|  | ||||
|   12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | ||||
| REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | ||||
| INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | ||||
| OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | ||||
| TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | ||||
| YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | ||||
| PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | ||||
| POSSIBILITY OF SUCH DAMAGES. | ||||
|  | ||||
| 		     END OF TERMS AND CONDITIONS | ||||
|  | ||||
| 	    How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| convey the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     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 | ||||
|  | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
| If the program is interactive, make it output a short notice like this | ||||
| when it starts in an interactive mode: | ||||
|  | ||||
|     Gnomovision version 69, Copyright (C) year name of author | ||||
|     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||||
|     This is free software, and you are welcome to redistribute it | ||||
|     under certain conditions; type `show c' for details. | ||||
|  | ||||
| The hypothetical commands `show w' and `show c' should show the appropriate | ||||
| parts of the General Public License.  Of course, the commands you use may | ||||
| be called something other than `show w' and `show c'; they could even be | ||||
| mouse-clicks or menu items--whatever suits your program. | ||||
|  | ||||
| You should also get your employer (if you work as a programmer) or your | ||||
| school, if any, to sign a "copyright disclaimer" for the program, if | ||||
| necessary.  Here is a sample; alter the names: | ||||
|  | ||||
|   Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||||
|   `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||||
|  | ||||
|   <signature of Ty Coon>, 1 April 1989 | ||||
|   Ty Coon, President of Vice | ||||
|  | ||||
| This General Public License does not permit incorporating your program into | ||||
| proprietary programs.  If your program is a subroutine library, you may | ||||
| consider it more useful to permit linking proprietary applications with the | ||||
| library.  If this is what you want to do, use the GNU Library General | ||||
| Public License instead of this License. | ||||
							
								
								
									
										6
									
								
								PLUGINS/src/status/HISTORY
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								PLUGINS/src/status/HISTORY
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| VDR Plugin 'status' Revision History | ||||
| ------------------------------------ | ||||
|  | ||||
| 2002-05-18: Version 0.0.1 | ||||
|  | ||||
| - Initial revision. | ||||
							
								
								
									
										79
									
								
								PLUGINS/src/status/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								PLUGINS/src/status/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| # | ||||
| # Makefile for a Video Disk Recorder plugin | ||||
| # | ||||
| # $Id: Makefile 1.1 2002/06/16 13:26:00 kls Exp $ | ||||
|  | ||||
| # The official name of this plugin. | ||||
| # This name will be used in the '-P...' option of VDR to load the plugin. | ||||
| # By default the main source file also carries this name. | ||||
| # | ||||
| PLUGIN = status | ||||
|  | ||||
| ### The version number of this plugin (taken from the main source file): | ||||
|  | ||||
| VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g') | ||||
|  | ||||
| ### The directory environment: | ||||
|  | ||||
| DVBDIR = ../../../../DVB/ost/include | ||||
| VDRDIR = ../../.. | ||||
| VDRINC = $(VDRDIR)/include | ||||
| LIBDIR = ../../lib | ||||
| TMPDIR = /tmp | ||||
|  | ||||
| ### The version number of VDR (taken from VDR's "config.h"): | ||||
|  | ||||
| VDRVERSION = $(shell grep 'define VDRVERSION ' $(VDRDIR)/config.h | awk '{ print $$3 }' | sed -e 's/"//g') | ||||
|  | ||||
| ### The name of the distribution archive: | ||||
|  | ||||
| ARCHIVE = $(PLUGIN)-$(VERSION) | ||||
| PACKAGE = vdr-$(ARCHIVE) | ||||
|  | ||||
| ### Includes and Defines (add further entries here): | ||||
|  | ||||
| INCLUDES = -I$(VDRINC) -I$(DVBDIR) | ||||
|  | ||||
| DEFINES = -DPLUGIN_NAME_I18N='"$(PLUGIN)"' | ||||
|  | ||||
| ### The object files (add further files here): | ||||
|  | ||||
| OBJS = $(PLUGIN).o | ||||
|  | ||||
| ### The C++ compiler and options: | ||||
|  | ||||
| CXX      = g++ | ||||
| CXXFLAGS = -g -O2 -Wall -Woverloaded-virtual | ||||
|  | ||||
| ### Implicit rules: | ||||
|  | ||||
| %.o: %.c | ||||
| 	$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $< | ||||
|  | ||||
| # Dependencies: | ||||
|  | ||||
| MAKEDEP = g++ -MM -MG | ||||
| DEPFILE = .dependencies | ||||
| $(DEPFILE): Makefile | ||||
| 	@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ | ||||
|  | ||||
| -include $(DEPFILE) | ||||
|  | ||||
| ### Targets: | ||||
|  | ||||
| all: libvdr-$(PLUGIN).so | ||||
|  | ||||
| libvdr-$(PLUGIN).so: $(OBJS) | ||||
| 	$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@ | ||||
| 	@cp $@ $(LIBDIR)/$@.$(VDRVERSION) | ||||
|  | ||||
| package: clean | ||||
| 	@-rm -rf $(TMPDIR)/$(ARCHIVE) | ||||
| 	@mkdir $(TMPDIR)/$(ARCHIVE) | ||||
| 	@cp -a * $(TMPDIR)/$(ARCHIVE) | ||||
| 	@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE) | ||||
| 	@-rm -rf $(TMPDIR)/$(ARCHIVE) | ||||
| 	@echo Distribution package created as $(PACKAGE).tgz | ||||
|  | ||||
| clean: | ||||
| 	@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ | ||||
							
								
								
									
										11
									
								
								PLUGINS/src/status/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								PLUGINS/src/status/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| This is a "plugin" for the Video Disk Recorder (VDR). | ||||
|  | ||||
| Written by:                  Klaus Schmidinger <kls@cadsoft.de> | ||||
|  | ||||
| Project's homepage:          www.cadsoft.de/people/kls/vdr | ||||
|  | ||||
| Latest version available at: www.cadsoft.de/people/kls/vdr/software.htm | ||||
|  | ||||
| See the file COPYING for license information. | ||||
|  | ||||
| Description: This is an example that shows the use of cStatus. | ||||
							
								
								
									
										179
									
								
								PLUGINS/src/status/status.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								PLUGINS/src/status/status.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,179 @@ | ||||
| /* | ||||
|  * status.c: A plugin for the Video Disk Recorder | ||||
|  * | ||||
|  * See the README file for copyright information and how to reach the author. | ||||
|  * | ||||
|  * $Id: status.c 1.1 2002/06/16 13:26:00 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #include <vdr/plugin.h> | ||||
| #include <vdr/status.h> | ||||
|  | ||||
| static const char *VERSION        = "0.0.1"; | ||||
| static const char *DESCRIPTION    = "Status monitor test"; | ||||
| static const char *MAINMENUENTRY  = NULL; | ||||
|  | ||||
| // --- | ||||
|  | ||||
| class cStatusTest : public cStatus { | ||||
| protected: | ||||
|   virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber); | ||||
|   virtual void Recording(const cDevice *Device, const char *Name); | ||||
|   virtual void Replaying(const cDvbPlayerControl *DvbPlayerControl, const char *Name); | ||||
|   virtual void SetVolume(int Volume, bool Absolute); | ||||
|   virtual void OsdClear(void); | ||||
|   virtual void OsdTitle(const char *Title); | ||||
|   virtual void OsdStatusMessage(const char *Message); | ||||
|   virtual void OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue); | ||||
|   virtual void OsdCurrentItem(const char *Text); | ||||
|   virtual void OsdTextItem(const char *Text, bool Scroll); | ||||
|   virtual void OsdChannel(const char *Text); | ||||
|   virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle); | ||||
|   }; | ||||
|  | ||||
| void cStatusTest::ChannelSwitch(const cDevice *Device, int ChannelNumber) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::ChannelSwitch  %d %d", Device->CardIndex(), ChannelNumber); | ||||
| } | ||||
|  | ||||
| void cStatusTest::Recording(const cDevice *Device, const char *Name) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::Recording  %d %s", Device->CardIndex(), Name); | ||||
| } | ||||
|  | ||||
| void cStatusTest::Replaying(const cDvbPlayerControl *DvbPlayerControl, const char *Name) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::Replaying  %s", Name); | ||||
| } | ||||
|  | ||||
| void cStatusTest::SetVolume(int Volume, bool Absolute) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::SetVolume  %d %d", Volume, Absolute); | ||||
| } | ||||
|  | ||||
| void cStatusTest::OsdClear(void) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::OsdClear"); | ||||
| } | ||||
|  | ||||
| void cStatusTest::OsdTitle(const char *Title) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::OsdTitle '%s'", Title); | ||||
| } | ||||
|  | ||||
| void cStatusTest::OsdStatusMessage(const char *Message) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::OsdStatusMessage '%s'", Message); | ||||
| } | ||||
|  | ||||
| void cStatusTest::OsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::OsdHelpKeys %s - %s - %s - %s", Red, Green, Yellow, Blue); | ||||
| } | ||||
|  | ||||
| void cStatusTest::OsdCurrentItem(const char *Text) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::OsdCurrentItem %s", Text); | ||||
| } | ||||
|  | ||||
| void cStatusTest::OsdTextItem(const char *Text, bool Scroll) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::OsdTextItem %s %d", Text, Scroll); | ||||
| } | ||||
|  | ||||
| void cStatusTest::OsdChannel(const char *Text) | ||||
| { | ||||
|   dsyslog("status: cStatusTest::OsdChannel %s", Text); | ||||
| } | ||||
|  | ||||
| void cStatusTest::OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle) | ||||
| { | ||||
|   char buffer[25]; | ||||
|   struct tm tm_r; | ||||
|   dsyslog("status: cStatusTest::OsdProgramme"); | ||||
|   strftime(buffer, sizeof(buffer), "%R", localtime_r(&PresentTime, &tm_r)); | ||||
|   dsyslog("%5s %s", buffer, PresentTitle); | ||||
|   dsyslog("%5s %s", "", PresentSubtitle); | ||||
|   strftime(buffer, sizeof(buffer), "%R", localtime_r(&FollowingTime, &tm_r)); | ||||
|   dsyslog("%5s %s", buffer, FollowingTitle); | ||||
|   dsyslog("%5s %s", "", FollowingSubtitle); | ||||
| } | ||||
|  | ||||
| // --- | ||||
|  | ||||
| class cPluginStatus : public cPlugin { | ||||
| private: | ||||
|   // Add any member variables or functions you may need here. | ||||
|   cStatusTest *statusTest; | ||||
| public: | ||||
|   cPluginStatus(void); | ||||
|   virtual ~cPluginStatus(); | ||||
|   virtual const char *Version(void) { return VERSION; } | ||||
|   virtual const char *Description(void) { return DESCRIPTION; } | ||||
|   virtual const char *CommandLineHelp(void); | ||||
|   virtual bool ProcessArgs(int argc, char *argv[]); | ||||
|   virtual bool Start(void); | ||||
|   virtual void Housekeeping(void); | ||||
|   virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; } | ||||
|   virtual cOsdMenu *MainMenuAction(void); | ||||
|   virtual cMenuSetupPage *SetupMenu(void); | ||||
|   virtual bool SetupParse(const char *Name, const char *Value); | ||||
|   }; | ||||
|  | ||||
| cPluginStatus::cPluginStatus(void) | ||||
| { | ||||
|   // Initialize any member varaiables here. | ||||
|   // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL | ||||
|   // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT! | ||||
|   statusTest = NULL; | ||||
| } | ||||
|  | ||||
| cPluginStatus::~cPluginStatus() | ||||
| { | ||||
|   // Clean up after yourself! | ||||
|   delete statusTest; | ||||
| } | ||||
|  | ||||
| const char *cPluginStatus::CommandLineHelp(void) | ||||
| { | ||||
|   // Return a string that describes all known command line options. | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| bool cPluginStatus::ProcessArgs(int argc, char *argv[]) | ||||
| { | ||||
|   // Implement command line argument processing here if applicable. | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| bool cPluginStatus::Start(void) | ||||
| { | ||||
|   // Start any background activities the plugin shall perform. | ||||
|   statusTest = new cStatusTest; | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| void cPluginStatus::Housekeeping(void) | ||||
| { | ||||
|   // Perform any cleanup or other regular tasks. | ||||
| } | ||||
|  | ||||
| cOsdMenu *cPluginStatus::MainMenuAction(void) | ||||
| { | ||||
|   // Perform the action when selected from the main VDR menu. | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| cMenuSetupPage *cPluginStatus::SetupMenu(void) | ||||
| { | ||||
|   // Return a setup menu in case the plugin supports one. | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| bool cPluginStatus::SetupParse(const char *Name, const char *Value) | ||||
| { | ||||
|   // Parse your own setup parameters and store their values. | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| VDRPLUGINCREATOR(cPluginStatus); // Don't touch this! | ||||
							
								
								
									
										8
									
								
								device.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								device.c
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * how to reach the author. | ||||
|  * | ||||
|  * $Id: device.c 1.1 2002/06/16 12:29:09 kls Exp $ | ||||
|  * $Id: device.c 1.2 2002/06/16 13:23:31 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "device.h" | ||||
| @@ -459,7 +459,7 @@ eSetChannelResult cDevice::SetChannel(int ChannelNumber, int Frequency, char Pol | ||||
|   //XXX+StopTransfer(); | ||||
|   //XXX+StopReplay(); | ||||
|  | ||||
|   cStatusMonitor::MsgChannelSwitch(this, 0); | ||||
|   cStatus::MsgChannelSwitch(this, 0); | ||||
|  | ||||
|   // Must set this anyway to avoid getting stuck when switching through | ||||
|   // channels with 'Up' and 'Down' keys: | ||||
| @@ -639,7 +639,7 @@ eSetChannelResult cDevice::SetChannel(int ChannelNumber, int Frequency, char Pol | ||||
|   if (Result == scrOk && siProcessor) | ||||
|      siProcessor->SetCurrentTransponder(Frequency); | ||||
|  | ||||
|   cStatusMonitor::MsgChannelSwitch(this, ChannelNumber); | ||||
|   cStatus::MsgChannelSwitch(this, ChannelNumber); | ||||
|  | ||||
|   return Result; | ||||
| } | ||||
| @@ -660,7 +660,7 @@ void cDevice::SetVolume(int Volume, bool Absolute) | ||||
|      audioMixer_t am; | ||||
|      am.volume_left = am.volume_right = volume; | ||||
|      CHECK(ioctl(fd_audio, AUDIO_SET_MIXER, &am)); | ||||
|      cStatusMonitor::MsgSetVolume(volume, Absolute); | ||||
|      cStatus::MsgSetVolume(volume, Absolute); | ||||
|      if (volume > 0) | ||||
|         mute = false; | ||||
|      } | ||||
|   | ||||
							
								
								
									
										283
									
								
								dvbapi.h
									
									
									
									
									
								
							
							
						
						
									
										283
									
								
								dvbapi.h
									
									
									
									
									
								
							| @@ -1,283 +0,0 @@ | ||||
| /* | ||||
|  * dvbapi.h: Interface to the DVB driver | ||||
|  * | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * how to reach the author. | ||||
|  * | ||||
|  * $Id: dvbapi.h 1.72 2002/05/20 10:58:20 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #ifndef __DVBAPI_H | ||||
| #define __DVBAPI_H | ||||
|  | ||||
| #include <stdlib.h> // FIXME: this is apparently necessary for the ost/... header files | ||||
|                     // FIXME: shouldn't every header file include ALL the other header | ||||
|                     // FIXME: files it depends on? The sequence in which header files | ||||
|                     // FIXME: are included here should not matter - and it should NOT | ||||
|                     // FIXME: be necessary to include <stdlib.h> here! | ||||
| #include <linux/videodev.h> | ||||
| #include <ost/dmx.h> | ||||
| #include <ost/sec.h> | ||||
| #include <ost/frontend.h> | ||||
| #include <ost/video.h> | ||||
| #include <ost/audio.h> | ||||
| #include <stdio.h> | ||||
| #include "eit.h" | ||||
| #include "thread.h" | ||||
|  | ||||
| #define FRAMESPERSEC 25 | ||||
|  | ||||
| // The maximum file size is limited by the range that can be covered | ||||
| // with 'int'. 4GB might be possible (if the range is considered | ||||
| // 'unsigned'), 2GB should be possible (even if the range is considered | ||||
| // 'signed'), so let's use 2000MB for absolute safety (the actual file size | ||||
| // may be slightly higher because we stop recording only before the next | ||||
| // 'I' frame, to have a complete Group Of Pictures): | ||||
| #define MAXVIDEOFILESIZE 2000 // MB | ||||
| #define MINVIDEOFILESIZE  100 // MB | ||||
|  | ||||
| #define MAXVOLUME         255 | ||||
| #define VOLUMEDELTA         5 // used to increase/decrease the volume | ||||
|  | ||||
| const char *IndexToHMSF(int Index, bool WithFrame = false); | ||||
|       // Converts the given index to a string, optionally containing the frame number. | ||||
| int HMSFToIndex(const char *HMSF); | ||||
|       // Converts the given string (format: "hh:mm:ss.ff") to an index. | ||||
|  | ||||
| enum eSetChannelResult { scrOk, scrNoTransfer, scrFailed }; | ||||
|  | ||||
| class cChannel; | ||||
|  | ||||
| class cRecordBuffer; | ||||
| class cPlayBuffer; | ||||
| class cReplayBuffer; | ||||
| class cTransferBuffer; | ||||
| class cCuttingBuffer; | ||||
|  | ||||
| class cVideoCutter { | ||||
| private: | ||||
|   static char *editedVersionName; | ||||
|   static cCuttingBuffer *cuttingBuffer; | ||||
|   static bool error; | ||||
|   static bool ended; | ||||
| public: | ||||
|   static bool Start(const char *FileName); | ||||
|   static void Stop(void); | ||||
|   static bool Active(void); | ||||
|   static bool Error(void); | ||||
|   static bool Ended(void); | ||||
|   }; | ||||
|  | ||||
| class cDvbApi { | ||||
|   friend class cOsd; | ||||
|   friend class cRecordBuffer; | ||||
|   friend class cReplayBuffer; | ||||
|   friend class cTransferBuffer; | ||||
| private: | ||||
|   FrontendType frontendType; | ||||
|   int fd_osd, fd_frontend, fd_sec, fd_dvr, fd_audio, fd_video, fd_demuxa1, fd_demuxa2, fd_demuxd1, fd_demuxd2, fd_demuxv, fd_demuxt; | ||||
|   int vPid, aPid1, aPid2, dPid1, dPid2; | ||||
|   int OsdDeviceHandle(void) { return fd_osd; } | ||||
|   bool SetPid(int fd, dmxPesType_t PesType, int Pid, dmxOutput_t Output); | ||||
|   bool SetVpid(int Vpid, dmxOutput_t Output)  { return SetPid(fd_demuxv,  DMX_PES_VIDEO,    Vpid, Output); } | ||||
|   bool SetApid1(int Apid, dmxOutput_t Output) { return SetPid(fd_demuxa1, DMX_PES_AUDIO,    Apid, Output); } | ||||
|   bool SetApid2(int Apid, dmxOutput_t Output) { return SetPid(fd_demuxa2, DMX_PES_OTHER,    Apid, Output); } | ||||
|   bool SetDpid1(int Dpid, dmxOutput_t Output) { return SetPid(fd_demuxd1, DMX_PES_OTHER,    Dpid, Output); } | ||||
|   bool SetDpid2(int Dpid, dmxOutput_t Output) { return SetPid(fd_demuxd2, DMX_PES_OTHER,    Dpid, Output); } | ||||
|   bool SetTpid(int Tpid, dmxOutput_t Output)  { return SetPid(fd_demuxt,  DMX_PES_TELETEXT, Tpid, Output); } | ||||
|   bool SetPids(bool ForRecording); | ||||
|   cDvbApi(int n); | ||||
| public: | ||||
|   ~cDvbApi(); | ||||
|  | ||||
| #define MAXDVBAPI  4 // the maximum number of DVB cards in the system | ||||
| #define MAXCACAPS 16 // the maximum number of different CA values per DVB card | ||||
|  | ||||
|   static int NumDvbApis; | ||||
| private: | ||||
|   static cDvbApi *dvbApi[MAXDVBAPI]; | ||||
|   static int useDvbApi; | ||||
|   int cardIndex; | ||||
|   int caCaps[MAXCACAPS]; | ||||
|   int CanShift(int Ca, int Priority, int UsedCards = 0); | ||||
| public: | ||||
|   static cDvbApi *PrimaryDvbApi; | ||||
|   static void SetUseDvbApi(int n); | ||||
|          // Sets the 'useDvbApi' flag of the given DVB device. | ||||
|          // If this function is not called before Initialize(), all DVB devices | ||||
|          // will be used. | ||||
|   static bool SetPrimaryDvbApi(int n); | ||||
|          // Sets the primary DVB device to 'n' (which must be in the range | ||||
|          // 1...NumDvbApis) and returns true if this was possible. | ||||
|   static cDvbApi *GetDvbApi(int Ca, int Priority); | ||||
|          // Selects a free DVB device, avoiding the PrimaryDvbApi if possible. | ||||
|          // If Ca is not 0, the device with the given number will be returned | ||||
|          // in case Ca is <= MAXDVBAPI, or the device that provides the given | ||||
|          // value in its caCaps. | ||||
|          // If all DVB devices are currently recording, the one recording the | ||||
|          // lowest priority timer (if any) that is lower than the given Priority | ||||
|          // will be returned. | ||||
|          // The caller must check whether the returned DVB device is actually | ||||
|          // recording and stop recording if necessary. | ||||
|   int CardIndex(void) const { return cardIndex; } | ||||
|          // Returns the card index of this DvbApi (0 ... MAXDVBAPI - 1). | ||||
|   static void SetCaCaps(void); | ||||
|          // Sets the CaCaps of all DVB devices according to the Setup data. | ||||
|   int ProvidesCa(int Ca); | ||||
|          // Checks whether this DVB device provides the given value in its | ||||
|          // caCaps. Returns 0 if the value is not provided, 1 if only this | ||||
|          // value is provided, and > 1 if this and other values are provided. | ||||
|          // If the given value is equal to the number of this DVB device, | ||||
|          // 1 is returned. If it is 0 (FTA), 1 plus the number of other values | ||||
|          // in caCaps is returned. | ||||
|   static bool Probe(const char *FileName); | ||||
|          // Probes for existing DVB devices. | ||||
|   static bool Initialize(void); | ||||
|          // Initializes the DVB API. | ||||
|          // Must be called before accessing any DVB functions. | ||||
|   static void Shutdown(void); | ||||
|          // Closes down all DVB devices. | ||||
|          // Must be called at the end of the program. | ||||
|  | ||||
|   // EIT facilities | ||||
|  | ||||
| private: | ||||
|   cSIProcessor *siProcessor; | ||||
| public: | ||||
|   // Image Grab facilities | ||||
|  | ||||
|   bool GrabImage(const char *FileName, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1); | ||||
|  | ||||
|   // Video format facilities: | ||||
|  | ||||
|   void SetVideoFormat(videoFormat_t Format); | ||||
|  | ||||
|   // Channel facilities | ||||
|  | ||||
| private: | ||||
|   int currentChannel; | ||||
| public: | ||||
|   eSetChannelResult SetChannel(int ChannelNumber, int Frequency, char Polarization, int Diseqc, int Srate, int Vpid, int Apid1, int Apid2, int Dpid1, int Dpid2, int Tpid, int Ca, int Pnr); | ||||
|   static int CurrentChannel(void) { return PrimaryDvbApi ? PrimaryDvbApi->currentChannel : 0; } | ||||
|   int Channel(void) { return currentChannel; } | ||||
|  | ||||
|   // Transfer facilities | ||||
|  | ||||
| private: | ||||
|   cTransferBuffer *transferBuffer; | ||||
|   cDvbApi *transferringFromDvbApi; | ||||
| public: | ||||
|   bool Transferring(void); | ||||
|        // Returns true if we are currently transferring video data. | ||||
| private: | ||||
|   cDvbApi *StartTransfer(int TransferToVideoDev); | ||||
|        // Starts transferring video data from this DVB device to TransferToVideoDev. | ||||
|   void StopTransfer(void); | ||||
|        // Stops transferring video data (in case a transfer is currently active). | ||||
|  | ||||
|   // Record/Replay facilities | ||||
|  | ||||
| private: | ||||
|   cRecordBuffer *recordBuffer; | ||||
|   cPlayBuffer *replayBuffer; | ||||
|   int ca; | ||||
|   int priority; | ||||
|   int  Priority(void); | ||||
|        // Returns the priority of the current recording session (0..MAXPRIORITY), | ||||
|        // or -1 if no recording is currently active. The primary DVB device will | ||||
|        // always return at least Setup.PrimaryLimit-1. | ||||
|   int  SetModeRecord(void); | ||||
|        // Initiates recording mode and returns the file handle to read from. | ||||
|   void SetModeReplay(void); | ||||
|   void SetModeNormal(bool FromRecording); | ||||
| public: | ||||
|   int  Ca(void) { return ca; } | ||||
|        // Returns the ca of the current recording session. | ||||
|   int  SecondsToFrames(int Seconds); | ||||
|        // Returns the number of frames corresponding to the given number of seconds. | ||||
|   bool Recording(void); | ||||
|        // Returns true if we are currently recording. | ||||
|   bool Replaying(void); | ||||
|        // Returns true if we are currently replaying. | ||||
|   bool StartRecord(const char *FileName, int Ca, int Priority); | ||||
|        // Starts recording the current channel into the given file, with | ||||
|        // the given ca and priority. | ||||
|        // In order to be able to record longer movies, | ||||
|        // a numerical suffix will be appended to the file name. The inital | ||||
|        // value of that suffix will be larger than any existing file under | ||||
|        // the given name, thus allowing an interrupted recording to continue | ||||
|        // gracefully. | ||||
|        // Returns true if recording was started successfully. | ||||
|        // If there is already a recording session active, false will be | ||||
|        // returned. | ||||
|   void StopRecord(void); | ||||
|        // Stops the current recording session (if any). | ||||
|   bool StartReplay(const char *FileName); | ||||
|        // Starts replaying the given file. | ||||
|        // If there is already a replay session active, it will be stopped | ||||
|        // and the new file will be played back. | ||||
|   void StopReplay(void); | ||||
|        // Stops the current replay session (if any). | ||||
|   void Pause(void); | ||||
|        // Pauses the current replay session, or resumes a paused session. | ||||
|   void Play(void); | ||||
|        // Resumes normal replay mode. | ||||
|   void Forward(void); | ||||
|        // Runs the current replay session forward at a higher speed. | ||||
|   void Backward(void); | ||||
|        // Runs the current replay session backwards at a higher speed. | ||||
|   void SkipSeconds(int Seconds); | ||||
|        // Skips the given number of seconds in the current replay session. | ||||
|        // The sign of 'Seconds' determines the direction in which to skip. | ||||
|        // Use a very large negative value to go all the way back to the | ||||
|        // beginning of the recording. | ||||
|   int  SkipFrames(int Frames); | ||||
|        // Returns the new index into the current replay session after skipping | ||||
|        // the given number of frames (no actual repositioning is done!). | ||||
|        // The sign of 'Frames' determines the direction in which to skip. | ||||
|   bool GetIndex(int &Current, int &Total, bool SnapToIFrame = false); | ||||
|        // Returns the current and total frame index, optionally snapped to the | ||||
|        // nearest I-frame. | ||||
|   bool GetReplayMode(bool &Play, bool &Forward, int &Speed); | ||||
|        // Returns the current replay mode (if applicable). | ||||
|        // 'Play' tells whether we are playing or pausing, 'Forward' tells whether | ||||
|        // we are going forward or backward and 'Speed' is -1 if this is normal | ||||
|        // play/pause mode, 0 if it is single speed fast/slow forward/back mode | ||||
|        // and >0 if this is multi speed mode. | ||||
|   void Goto(int Index, bool Still = false); | ||||
|        // Positions to the given index and displays that frame as a still picture | ||||
|        // if Still is true. | ||||
|  | ||||
|   // Audio track facilities | ||||
|  | ||||
| public: | ||||
|   bool CanToggleAudioTrack(void); | ||||
|        // Returns true if we are currently replaying and this recording has two | ||||
|        // audio tracks, or if the current channel has two audio PIDs. | ||||
|   bool ToggleAudioTrack(void); | ||||
|        // Toggles the audio track if possible. | ||||
|  | ||||
|   // Dolby Digital audio facilities | ||||
|  | ||||
| private: | ||||
|   static char *audioCommand; | ||||
| public: | ||||
|   static void SetAudioCommand(const char *Command); | ||||
|   static const char *AudioCommand(void) { return audioCommand; } | ||||
|  | ||||
|   // Volume facilities: | ||||
|  | ||||
| private: | ||||
|   bool mute; | ||||
|   int volume; | ||||
| public: | ||||
|   bool IsMute(void) { return mute; } | ||||
|   bool ToggleMute(void); | ||||
|        // Turns the volume off or on and returns the new mute state. | ||||
|   void SetVolume(int Volume, bool Absolute = false); | ||||
|        // Sets the volume to the given value, either absolutely or relative to | ||||
|        // the current volume. | ||||
|   static int CurrentVolume(void) { return PrimaryDvbApi ? PrimaryDvbApi->volume : 0; } | ||||
|   }; | ||||
|  | ||||
| #endif //__DVBAPI_H | ||||
							
								
								
									
										10
									
								
								interface.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								interface.c
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * how to reach the author. | ||||
|  * | ||||
|  * $Id: interface.c 1.51 2002/06/10 16:30:00 kls Exp $ | ||||
|  * $Id: interface.c 1.52 2002/06/16 13:23:40 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "interface.h" | ||||
| @@ -128,7 +128,7 @@ void cInterface::Clear(void) | ||||
| { | ||||
|   if (open) | ||||
|      cOsd::Clear(); | ||||
|   cStatusMonitor::MsgOsdClear(); | ||||
|   cStatus::MsgOsdClear(); | ||||
| } | ||||
|  | ||||
| void cInterface::ClearEol(int x, int y, eDvbColor Color) | ||||
| @@ -289,7 +289,7 @@ void cInterface::Title(const char *s) | ||||
|         x = 0; | ||||
|      Write(x, 0, s, clrBlack, clrCyan); | ||||
|      } | ||||
|   cStatusMonitor::MsgOsdTitle(s); | ||||
|   cStatus::MsgOsdTitle(s); | ||||
| } | ||||
|  | ||||
| void cInterface::Status(const char *s, eDvbColor FgColor, eDvbColor BgColor) | ||||
| @@ -302,7 +302,7 @@ void cInterface::Status(const char *s, eDvbColor FgColor, eDvbColor BgColor) | ||||
|         x = 0; | ||||
|      Write(x, Line, s, FgColor, BgColor); | ||||
|      } | ||||
|   cStatusMonitor::MsgOsdStatusMessage(s); | ||||
|   cStatus::MsgOsdStatusMessage(s); | ||||
| } | ||||
|  | ||||
| void cInterface::Info(const char *s) | ||||
| @@ -358,7 +358,7 @@ void cInterface::Help(const char *Red, const char *Green, const char *Yellow, co | ||||
|   HelpButton(1, Green,  clrBlack, clrGreen); | ||||
|   HelpButton(2, Yellow, clrBlack, clrYellow); | ||||
|   HelpButton(3, Blue,   clrWhite, clrBlue); | ||||
|   cStatusMonitor::MsgOsdHelpKeys(Red, Green, Yellow, Blue); | ||||
|   cStatus::MsgOsdHelpKeys(Red, Green, Yellow, Blue); | ||||
| } | ||||
|  | ||||
| void cInterface::QueryKeys(void) | ||||
|   | ||||
							
								
								
									
										14
									
								
								menu.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								menu.c
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * how to reach the author. | ||||
|  * | ||||
|  * $Id: menu.c 1.196 2002/06/16 12:11:02 kls Exp $ | ||||
|  * $Id: menu.c 1.197 2002/06/16 13:23:51 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "menu.h" | ||||
| @@ -2169,7 +2169,7 @@ void cDisplayChannel::DisplayChannel(const cChannel *Channel) | ||||
|   Interface->Write(0, 0, buffer); | ||||
|   const char *date = DayDateTime(); | ||||
|   Interface->Write(-strlen(date), 0, date); | ||||
|   cStatusMonitor::MsgOsdChannel(buffer); | ||||
|   cStatus::MsgOsdChannel(buffer); | ||||
| } | ||||
|  | ||||
| void cDisplayChannel::DisplayInfo(void) | ||||
| @@ -2223,7 +2223,7 @@ void cDisplayChannel::DisplayInfo(void) | ||||
|               Interface->Flush(); | ||||
|               lines = Lines; | ||||
|               lastTime = time_ms(); | ||||
|               cStatusMonitor::MsgOsdProgramme(Present ? Present->GetTime() : 0, PresentTitle, PresentSubtitle, Following ? Following->GetTime() : 0, FollowingTitle, FollowingSubtitle); | ||||
|               cStatus::MsgOsdProgramme(Present ? Present->GetTime() : 0, PresentTitle, PresentSubtitle, Following ? Following->GetTime() : 0, FollowingTitle, FollowingSubtitle); | ||||
|               } | ||||
|            } | ||||
|         } | ||||
| @@ -2445,7 +2445,7 @@ cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer) | ||||
|   recorder = new cRecorder(fileName, ch->ca, timer->priority, ch->vpid, ch->apid1, ch->apid2, ch->dpid1, ch->dpid2); | ||||
|   if (device->Attach(recorder)) { | ||||
|      Recording.WriteSummary(); | ||||
|      cStatusMonitor::MsgRecording(device, fileName); | ||||
|      cStatus::MsgRecording(device, fileName); | ||||
|      Interface->DisplayRecording(device->CardIndex(), true); | ||||
|      } | ||||
|   else | ||||
| @@ -2492,7 +2492,7 @@ bool cRecordControl::GetEventInfo(void) | ||||
| void cRecordControl::Stop(bool KeepInstant) | ||||
| { | ||||
|   if (timer) { | ||||
|      cStatusMonitor::MsgRecording(device, NULL); | ||||
|      cStatus::MsgRecording(device, NULL); | ||||
|      DELETENULL(recorder); | ||||
|      timer->SetRecording(false); | ||||
|      if ((IsInstant() && !KeepInstant) || (timer->IsSingleEvent() && !timer->Matches())) { | ||||
| @@ -2694,14 +2694,14 @@ cReplayControl::cReplayControl(void) | ||||
|      if (!Start(fileName)) | ||||
|         Interface->Error(tr("Channel locked (recording)!"));//XXX+ | ||||
|      else | ||||
|         cStatusMonitor::MsgReplaying(this, fileName); | ||||
|         cStatus::MsgReplaying(this, fileName); | ||||
|      } | ||||
| } | ||||
|  | ||||
| cReplayControl::~cReplayControl() | ||||
| { | ||||
|   Hide(); | ||||
|   cStatusMonitor::MsgReplaying(this, NULL); | ||||
|   cStatus::MsgReplaying(this, NULL); | ||||
|   Stop(); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * how to reach the author. | ||||
|  * | ||||
|  * $Id: menuitems.c 1.5 2002/05/19 12:34:33 kls Exp $ | ||||
|  * $Id: menuitems.c 1.6 2002/06/16 13:23:56 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "menuitems.h" | ||||
| @@ -398,7 +398,7 @@ void cMenuTextItem::Display(int Offset, eDvbColor FgColor, eDvbColor BgColor) | ||||
|   // scroll indicators use inverted color scheme! | ||||
|   if (CanScrollUp())   Interface->Write(x + w - 1, y,         "^", bgColor, fgColor); | ||||
|   if (CanScrollDown()) Interface->Write(x + w - 1, y + h - 1, "v", bgColor, fgColor); | ||||
|   cStatusMonitor::MsgOsdTextItem(text); | ||||
|   cStatus::MsgOsdTextItem(text); | ||||
| } | ||||
|  | ||||
| void cMenuTextItem::ScrollUp(bool Page) | ||||
| @@ -408,7 +408,7 @@ void cMenuTextItem::ScrollUp(bool Page) | ||||
|      offset = max(offset - (Page ? h : 1), 0); | ||||
|      Display(); | ||||
|      } | ||||
|   cStatusMonitor::MsgOsdTextItem(NULL, true); | ||||
|   cStatus::MsgOsdTextItem(NULL, true); | ||||
| } | ||||
|  | ||||
| void cMenuTextItem::ScrollDown(bool Page) | ||||
| @@ -418,7 +418,7 @@ void cMenuTextItem::ScrollDown(bool Page) | ||||
|      offset = min(offset + (Page ? h : 1), lines - h); | ||||
|      Display(); | ||||
|      } | ||||
|   cStatusMonitor::MsgOsdTextItem(NULL, false); | ||||
|   cStatus::MsgOsdTextItem(NULL, false); | ||||
| } | ||||
|  | ||||
| eOSState cMenuTextItem::ProcessKey(eKeys Key) | ||||
|   | ||||
							
								
								
									
										6
									
								
								osd.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								osd.c
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * how to reach the author. | ||||
|  * | ||||
|  * $Id: osd.c 1.28 2002/06/10 16:30:00 kls Exp $ | ||||
|  * $Id: osd.c 1.29 2002/06/16 13:24:00 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "osd.h" | ||||
| @@ -434,7 +434,7 @@ void cOsdMenu::Display(void) | ||||
|          if (item) { | ||||
|             item->Display(i - first, i == current ? clrBlack : clrWhite, i == current ? clrCyan : clrBackground); | ||||
|             if (i == current) | ||||
|                cStatusMonitor::MsgOsdCurrentItem(item->Text()); | ||||
|                cStatus::MsgOsdCurrentItem(item->Text()); | ||||
|             } | ||||
|          if (++n == MAXOSDITEMS) //TODO get this from Interface!!! | ||||
|             break; | ||||
| @@ -462,7 +462,7 @@ void cOsdMenu::DisplayCurrent(bool Current) | ||||
|   if (item) { | ||||
|      item->Display(current - first, Current ? clrBlack : clrWhite, Current ? clrCyan : clrBackground); | ||||
|      if (Current) | ||||
|         cStatusMonitor::MsgOsdCurrentItem(item->Text()); | ||||
|         cStatus::MsgOsdCurrentItem(item->Text()); | ||||
|      } | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										58
									
								
								status.c
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								status.c
									
									
									
									
									
								
							| @@ -4,93 +4,93 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * how to reach the author. | ||||
|  * | ||||
|  * $Id: status.c 1.2 2002/06/16 12:10:44 kls Exp $ | ||||
|  * $Id: status.c 1.3 2002/06/16 13:24:36 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "status.h" | ||||
|  | ||||
| // --- cStatusMonitor -------------------------------------------------------- | ||||
| // --- cStatus --------------------------------------------------------------- | ||||
|  | ||||
| cList<cStatusMonitor> cStatusMonitor::statusMonitors; | ||||
| cList<cStatus> cStatus::statusMonitors; | ||||
|  | ||||
| cStatusMonitor::cStatusMonitor(void) | ||||
| cStatus::cStatus(void) | ||||
| { | ||||
|   statusMonitors.Add(this); | ||||
| } | ||||
|  | ||||
| cStatusMonitor::~cStatusMonitor() | ||||
| cStatus::~cStatus() | ||||
| { | ||||
|   statusMonitors.Del(this, false); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgChannelSwitch(const cDevice *Device, int ChannelNumber) | ||||
| void cStatus::MsgChannelSwitch(const cDevice *Device, int ChannelNumber) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->ChannelSwitch(Device, ChannelNumber); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgRecording(const cDevice *Device, const char *Name) | ||||
| void cStatus::MsgRecording(const cDevice *Device, const char *Name) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->Recording(Device, Name); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgReplaying(const cDvbPlayerControl *DvbPlayerControl, const char *Name) | ||||
| void cStatus::MsgReplaying(const cDvbPlayerControl *DvbPlayerControl, const char *Name) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->Replaying(DvbPlayerControl, Name); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgSetVolume(int Volume, bool Absolute) | ||||
| void cStatus::MsgSetVolume(int Volume, bool Absolute) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->SetVolume(Volume, Absolute); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgOsdClear(void) | ||||
| void cStatus::MsgOsdClear(void) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->OsdClear(); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgOsdTitle(const char *Title) | ||||
| void cStatus::MsgOsdTitle(const char *Title) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->OsdTitle(Title); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgOsdStatusMessage(const char *Message) | ||||
| void cStatus::MsgOsdStatusMessage(const char *Message) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->OsdStatusMessage(Message); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgOsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue) | ||||
| void cStatus::MsgOsdHelpKeys(const char *Red, const char *Green, const char *Yellow, const char *Blue) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->OsdHelpKeys(Red, Green, Yellow, Blue); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgOsdCurrentItem(const char *Text) | ||||
| void cStatus::MsgOsdCurrentItem(const char *Text) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->OsdCurrentItem(Text); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgOsdTextItem(const char *Text, bool Scroll) | ||||
| void cStatus::MsgOsdTextItem(const char *Text, bool Scroll) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->OsdTextItem(Text, Scroll); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgOsdChannel(const char *Text) | ||||
| void cStatus::MsgOsdChannel(const char *Text) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->OsdChannel(Text); | ||||
| } | ||||
|  | ||||
| void cStatusMonitor::MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle) | ||||
| void cStatus::MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle) | ||||
| { | ||||
|   for (cStatusMonitor *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm)) | ||||
|       sm->OsdProgramme(PresentTime, PresentTitle, PresentSubtitle, FollowingTime, FollowingTitle, FollowingSubtitle); | ||||
| } | ||||
|   | ||||
							
								
								
									
										10
									
								
								status.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								status.h
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|  * See the main source file 'vdr.c' for copyright information and | ||||
|  * how to reach the author. | ||||
|  * | ||||
|  * $Id: status.h 1.2 2002/06/16 12:09:55 kls Exp $ | ||||
|  * $Id: status.h 1.3 2002/06/16 13:24:50 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #ifndef __STATUS_H | ||||
| @@ -15,9 +15,9 @@ | ||||
| #include "dvbplayer.h" | ||||
| #include "tools.h" | ||||
|  | ||||
| class cStatusMonitor : public cListObject { | ||||
| class cStatus : public cListObject { | ||||
| private: | ||||
|   static cList<cStatusMonitor> statusMonitors; | ||||
|   static cList<cStatus> statusMonitors; | ||||
| protected: | ||||
|   // These functions can be implemented by derived classes to receive status information: | ||||
|   virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber) {} | ||||
| @@ -55,8 +55,8 @@ protected: | ||||
|   virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle) {} | ||||
|                // The OSD displays the given programme information. | ||||
| public: | ||||
|   cStatusMonitor(void); | ||||
|   virtual ~cStatusMonitor(); | ||||
|   cStatus(void); | ||||
|   virtual ~cStatus(); | ||||
|   // These functions are called whenever the related status information changes: | ||||
|   static void MsgChannelSwitch(const cDevice *Device, int ChannelNumber); | ||||
|   static void MsgRecording(const cDevice *Device, const char *Name); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user