mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-04-23 17:21:03 +02:00
363 lines
14 KiB
C
363 lines
14 KiB
C
/* rlm.h
|
|
*
|
|
* The Rivendell Loadable Module Interface
|
|
*
|
|
* (C) Copyright 2008-2018 Fred Gleason <fredg@paravelsystems.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
*
|
|
* This interface can be used to create "Rivendell Loadable Modules" [RLMs]
|
|
* that enable Rivendell's "Now & Next" capability to supply program associated
|
|
* data [PAD] to external devices and systems. Runtime module configuration
|
|
* is accomplished in RDAdmin->ManageHosts->RDAirPlay->ConfigureNow&Next.
|
|
*
|
|
* Compiled plugins are dynamically loadable libraries (DLLs) and have names
|
|
* of the form '<basename>.rlm'. The following callbacks are provided:
|
|
*
|
|
* void <basename>_RLMStart(void *ptr,const char *arg)
|
|
* Called once upon RDAirPlay startup. The plugin should do any necessary
|
|
* startup tasks (opening i/o devices, allocating memory, etc) here. The
|
|
* single argument 'arg' is a null-terminated string, consisting of the
|
|
* 'Argument' parameter supplied in the specific runtime configuration
|
|
* from RDAdmin. The 'ptr' argument is an opaque pointer that is
|
|
* used as the first argument to the utility functions.
|
|
*
|
|
* void <basename>_RLMFree(void *ptr)
|
|
* Called once upon RDAirPlay shutdown. Any system resources allocated
|
|
* by the plugin should be released here. The 'ptr' argument is an opaque
|
|
* pointer that is be used as the first argument to any of the utility
|
|
* functions.
|
|
*
|
|
*
|
|
* void <basename>_RLMPadDataSent(void *ptr,const struct rlm_svc *svc,
|
|
* const struct rlm_log *log,
|
|
* const struct rlm_pad *now,
|
|
* const struct rlm_pad *next)
|
|
* Called each time RDAirPlay changes play state on a log. The 'svc'
|
|
* and 'log' parameters provide information about the current log and
|
|
* service respectively. The 'ptr' argument is an opaque pointer that
|
|
* is used as the first argument to the utility functions.
|
|
*
|
|
* WARNING: the structures provided in this callback are dynamically
|
|
* allocated, their scope is valid only within the callback!
|
|
*
|
|
* void <basename>_RLMTimerExpired(void *ptr,int timernum)
|
|
* Called each time the system RLM timer indicated by 'timernum' expires.
|
|
* See the 'RLMStartTimer()' and 'RLMStopTimer()' functions for info on
|
|
* using timers. The 'ptr' argument is an opaque pointer that is
|
|
* used as the first argument to the utility functions.
|
|
*
|
|
* void <basename>_RLMSerialDataReceived(void *ptr,int handle,
|
|
* const char *data,int len)
|
|
* Called each time data is received on an open tty/serial device. See
|
|
* the 'RLMOpenSerial()' and 'RLMCloseSerial()' functions for info on
|
|
* using tty/serial devices. The 'ptr' argument is an opaque pointer
|
|
* that is used as the first argument to the utility functions.
|
|
*/
|
|
|
|
#ifndef RLM_H
|
|
#define RLM_H
|
|
|
|
#include <stdint.h>
|
|
#include <syslog.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* RLM Interface Version
|
|
*/
|
|
#define RLM_VERSION 18
|
|
|
|
/*
|
|
* Available Timers
|
|
*/
|
|
#define RLM_MAX_TIMERS 32
|
|
|
|
/*
|
|
* Timer Modes
|
|
* (for use in the RLMStartTimer() function).
|
|
*/
|
|
#define RLM_TIMER_REPEATING 0
|
|
#define RLM_TIMER_ONESHOT 1
|
|
|
|
/*
|
|
* Parity Modes
|
|
* (for use in the RLMOpenSerial() function).
|
|
*/
|
|
#define RLM_PARITY_NONE 0
|
|
#define RLM_PARITY_EVEN 1
|
|
#define RLM_PARITY_ODD 2
|
|
|
|
/*
|
|
* Cart Types
|
|
* (for use in the 'rlm_carttype' field of the 'rlm_pad' struct)
|
|
*/
|
|
#define RLM_CARTTYPE_ALL 0
|
|
#define RLM_CARTTYPE_AUDIO 1
|
|
#define RLM_CARTTYPE_MACRO 2
|
|
|
|
/*
|
|
* Log Machine Modes
|
|
* (for use in the 'rlm_mode' field of the 'rlm_log' struct)
|
|
*/
|
|
#define RLM_LOGMODE_LIVEASSIST 1
|
|
#define RLM_LOGMODE_AUTOMATIC 2
|
|
#define RLM_LOGMODE_MANUAL 3
|
|
|
|
/*
|
|
* Data Encodings
|
|
* (for use in the RLMResolveNowNextEncoded() function).
|
|
*/
|
|
#define RLM_ENCODE_NONE 0
|
|
#define RLM_ENCODE_XML 1
|
|
#define RLM_ENCODE_URL 2
|
|
|
|
/*
|
|
* Virtual Logs
|
|
*
|
|
*/
|
|
#define RLM_VLOG_QUANTITY 20
|
|
|
|
/*
|
|
* Service data structure
|
|
*/
|
|
struct rlm_svc {
|
|
char svc_name[256]; /* Service name */
|
|
char svc_pgmcode[256]; /* Program Code */
|
|
char reserved[1536]; /* Reserved for future use */
|
|
};
|
|
|
|
/*
|
|
* Log data structure
|
|
*/
|
|
struct rlm_log {
|
|
char log_name[65]; /* Log name */
|
|
uint32_t log_mach; /* Log machine number, 0=Main, 1=Aux 1, 2=Aux2,
|
|
* 100 - 119=vLogs */
|
|
char log_onair; /* On-air flag, 0=False, 1=True */
|
|
uint32_t log_mode; /* Log machine mode, 1=LiveAssist, 2=Automatic, 3=Manual */
|
|
char reserved[1974]; /* Reserved for future use */
|
|
};
|
|
|
|
/*
|
|
* Metadata structure
|
|
*/
|
|
struct rlm_pad {
|
|
uint32_t rlm_cartnum; /* Rivendell cart number */
|
|
uint32_t rlm_len; /* Event length, in milliseconds */
|
|
char rlm_year[5]; /* Cart year */
|
|
char rlm_group[11]; /* Rivendell Group Name */
|
|
char rlm_title[256]; /* Cart 'title' field */
|
|
char rlm_artist[256]; /* Cart 'artist' field */
|
|
char rlm_label[65]; /* Cart 'label' field */
|
|
char rlm_client[65]; /* Cart 'client' field */
|
|
char rlm_agency[65]; /* Cart 'agency' field */
|
|
char rlm_comp[65]; /* Cart 'composer' field */
|
|
char rlm_pub[65]; /* Cart 'publisher' field */
|
|
char rlm_userdef[256]; /* Cart 'user defined' field */
|
|
char rlm_album[256]; /* Cart 'album' field */
|
|
char rlm_isrc[12]; /* Cut International Standard Recording Code */
|
|
char rlm_isci[32]; /* Cut ISCI Code */
|
|
char rlm_carttype; /* Cart type, see RLM_CARTTYPE_* defines */
|
|
char rlm_ext_eventid[33]; /* Event ID, from external scheduler */
|
|
char rlm_ext_data[33]; /* Data, from external scheduler */
|
|
char rlm_ext_annctype[1]; /* Announcement Type, from external scheduler */
|
|
int32_t rlm_start_msec; /* Event start time, milliseconds part */
|
|
int32_t rlm_start_sec; /* Event start time, seconds part */
|
|
int32_t rlm_start_min; /* Event start time, minutes part */
|
|
int32_t rlm_start_hour; /* Event start time, hours part */
|
|
int32_t rlm_start_day; /* Event start date, day of month part */
|
|
int32_t rlm_start_mon; /* Event start date, month of year part */
|
|
int32_t rlm_start_year; /* Event start date, year part */
|
|
char rlm_conductor[65]; /* Cart 'conductor' field */
|
|
char rlm_song_id[33]; /* Cart 'songId' field */
|
|
char rlm_outcue[65]; /* Cut outcue field */
|
|
char rlm_description[65]; /* Cut description field */
|
|
char reserved[305]; /* Reserved for future use */
|
|
};
|
|
|
|
/*
|
|
* Communications Functions
|
|
*
|
|
*
|
|
* Send a UDP packet.
|
|
*
|
|
* The <ipaddr> parameter is a null-terminated string consisting of the
|
|
* IPv4 destination address in dotted-quad notation, and <port> is the
|
|
* destination UDP port number. All structures are in host (*not* network)
|
|
* byte order. The data to be sent, of length <len>, is pointed to by
|
|
* <data>.
|
|
*/
|
|
void RLMSendUdp(void *ptr,const char *ipaddr,uint16_t port,
|
|
const char *data,int len);
|
|
|
|
/*
|
|
* Open a tty device (serial port) for output.
|
|
*
|
|
* The <devname> parameter is a null-terminated string consisting of the
|
|
* name of the tty device to open (e.g. "/dev/ttyS0"). The <speed>,
|
|
* <parity> and <word_length> parameters define the communications
|
|
* parameters to be used.
|
|
*
|
|
* RETURNS: if successful, a non-negative integer that should be used
|
|
* as the <handle> argument for the RLMSendSerial() and RLMCloseSerial()
|
|
* functions. If unsuccessful, a negative integer will be returned.
|
|
*/
|
|
int RLMOpenSerial(void *ptr,const char *devname,int speed,
|
|
int parity,int word_length);
|
|
|
|
/*
|
|
* Output data on a tty device.
|
|
*
|
|
* Output data of length <len> pointed to by <data> on the tty device
|
|
* indicated by the <handle> value returned by the RLMOpenSerial() function.
|
|
*/
|
|
void RLMSendSerial(void *ptr,int handle,const char *data,int len);
|
|
|
|
/*
|
|
* Close a tty device.
|
|
*
|
|
* Close the tty device indicated by the <handle> value returned by the
|
|
* RLMOpenSerial() function.
|
|
*/
|
|
void RLMCloseSerial(void *ptr,int handle);
|
|
|
|
/*
|
|
* Convienence Functions
|
|
*/
|
|
|
|
/*
|
|
* Get a string indicating the system time.
|
|
*
|
|
* Returns a pointer to a null-terminated string indicating the system time,
|
|
* formatted as per the <format> argument. The following wildcards are
|
|
* supported:
|
|
* d the day as number without a leading zero (1-31)
|
|
* dd the day as number with a leading zero (01-31)
|
|
* ddd the abbreviated localized day name (e.g. 'Mon'..'Sun').
|
|
* dddd the long localized day name (e.g. 'Monday'..'Sunday').
|
|
* M the month as number without a leading zero (1-12)
|
|
* MM the month as number with a leading zero (01-12)
|
|
* MMM the abbreviated localized month name (e.g. 'Jan'..'Dec').
|
|
* MMMM the long localized month name (e.g. 'January'..'December').
|
|
* yy the year as two digit number (00-99)
|
|
* yyyy the year as four digit number (1752-8000)
|
|
* h the hour without a leading zero (0..23 or 1..12 if AM/PM
|
|
* display)
|
|
* hh the hour with a leading zero (00..23 or 01..12 if AM/PM display)
|
|
* m the minute without a leading zero (0..59)
|
|
* mm the minute with a leading zero (00..59)
|
|
* s the second whithout a leading zero (0..59)
|
|
* ss the second whith a leading zero (00..59)
|
|
* z the milliseconds without leading zeroes (0..999)
|
|
* zzz the milliseconds with leading zeroes (000..999)
|
|
* AP use AM/PM display. AP will be replaced by either "AM" or "PM".
|
|
* ap use am/pm display. ap will be replaced by either "am" or "pm".
|
|
*
|
|
* RETURNS: A pointer to a null terminated string. This string is statically
|
|
* allocated, and may be reused in subsequent calls to the utility functions.
|
|
*/
|
|
const char *RLMDateTime(void *ptr,int offset_msecs,const char *format);
|
|
|
|
/*
|
|
* Resolve standard Rivendell Now & Next wildcards, with the possiblity
|
|
* to encode the PAD fields.
|
|
*
|
|
* Returns a pointer to a null-terminated string resulting from resolving
|
|
* the 'standard' Rivendell Now & Next wildcards in accordance with the
|
|
* data values in the <now> and <next> parameters. The following wildcards
|
|
* are supported:
|
|
*
|
|
* Now Next Field
|
|
* ----------------------------------------------
|
|
* %n %N The Rivendell cart number
|
|
* %h %H Event length (in milliseconds)
|
|
* %g %G The Rivendell group name
|
|
* %t %T Title
|
|
* %a %A Artist
|
|
* %l %L Album
|
|
* %y %Y Year
|
|
* %b %B Record Label
|
|
* %c %C Client
|
|
* %e %E Agency
|
|
* %m %M Composer
|
|
* %p %P Publisher
|
|
* %r %R Conductor
|
|
* %s %S Song ID
|
|
* %u %U User Definied
|
|
* %o %O Outcue
|
|
* %i %I Description
|
|
* %D(<dt>) The current date/time, formatted according to <dt>. <dt>
|
|
* can be any of the wildcards supported by the RLMDateTime()
|
|
* function (see above).
|
|
*
|
|
* Additionally, an encoding can be specified to allow PAD fields to be
|
|
* escaped for a particular format. Available encodings are:
|
|
*
|
|
* RLM_ENCODE_NONE - Perform no character escaping.
|
|
* RLM_ENCODE_XML - Escape reserved characters as per XML-v1.0
|
|
* RLM_ENCODE_URL - Escape reserved characters as per RFC 2396 Section 2.4
|
|
*
|
|
* RETURNS: A pointer to a null terminated string. This string is statically
|
|
* allocated, and may be reused in subsequent calls to the utility functions.
|
|
*/
|
|
const char *RLMResolveNowNextEncoded(void *ptr,const struct rlm_pad *now,
|
|
const struct rlm_pad *next,
|
|
const char *format,int encoding);
|
|
|
|
/*
|
|
* Resolve standard Rivendell Now & Next wildcards
|
|
*
|
|
* (NOTE: This function is deprecated, and included merely to keep old code
|
|
* working. It should *not* be used in new code. For a better alternative,
|
|
* see the RLMResolveNowNextEncoded() function above).
|
|
*
|
|
* Returns a pointer to a null-terminated string resulting from resolving
|
|
* the 'standard' Rivendell Now & Next wildcards in accordance with the
|
|
* data values in the <now> and <next> parameters. The list of available
|
|
* wildcards can be found in the 'metadata_wildcards.txt' file in the
|
|
* Rivendell documentation directory.
|
|
*
|
|
* RETURNS: A pointer to a null terminated string. This string is statically
|
|
* allocated, and may be reused in subsequent calls to the utility functions.
|
|
*/
|
|
const char *RLMResolveNowNext(void *ptr,const struct rlm_pad *now,
|
|
const struct rlm_pad *next,const char *format);
|
|
|
|
void RLMLog(void *ptr,int prio,const char *msg);
|
|
void RLMStartTimer(void *ptr,int timernum,int msecs,int mode);
|
|
void RLMStopTimer(void *ptr,int timernum);
|
|
int RLMGetIntegerValue(void *ptr,const char *filename,const char *section,
|
|
const char *label,int default_value);
|
|
int RLMGetHexValue(void *ptr,const char *filename,
|
|
const char *section,const char *label,int default_value);
|
|
int RLMGetBooleanValue(void *ptr,const char *filename,
|
|
const char *section,const char *label,
|
|
int default_value);
|
|
const char *RLMGetStringValue(void *ptr,const char *filename,
|
|
const char *section,const char *label,
|
|
const char *default_value);
|
|
const char *RLMDateTimeDecode(void *ptr, const char *format,
|
|
const char *svc_name);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* RLM_H */
|