1 /* 2 TiMidity++ -- MIDI to WAVE converter and player 3 Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp> 4 Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi> 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 20 output.h 21 22 */ 23 24 #ifndef ___OUTPUT_H_ 25 #define ___OUTPUT_H_ 26 #include "output.h" 27 28 /* Data format encoding bits */ 29 /* {PE_16BIT,PE_ULAW,PE_ALAW} is alternative flag */ 30 /* {PE_SIGNED,PE_ULAW,PE_ALAW} is alternative flag */ 31 /* {PE_BYTESWAP,PE_ULAW,PE_ALAW} is alternative flag */ 32 /* {PE_16BIT,PE_24BIT} is alternative flag */ 33 #define PE_MONO (1u<<0) /* versus stereo */ 34 #define PE_SIGNED (1u<<1) /* versus unsigned */ 35 #define PE_16BIT (1u<<2) /* versus 8-bit */ 36 #define PE_ULAW (1u<<3) /* versus linear */ 37 #define PE_ALAW (1u<<4) /* versus linear */ 38 #define PE_BYTESWAP (1u<<5) /* versus the other way */ 39 #define PE_24BIT (1u<<6) /* versus 8-bit, 16-bit */ 40 41 /* for play_mode->acntl() */ 42 enum { 43 PM_REQ_MIDI, /* ARG: MidiEvent 44 * Send MIDI event. 45 * If PF_MIDI_EVENT is setted, acntl() is called 46 * with this request. 47 */ 48 49 PM_REQ_INST_NAME, /* ARG: char** 50 * Get Instrument name of channel. 51 */ 52 53 PM_REQ_DISCARD, /* ARG: not-used 54 * Discard the audio device buffer and returns 55 * immediatly. 56 */ 57 58 PM_REQ_FLUSH, /* ARG: not-used 59 * Wait until all audio data is out. 60 */ 61 62 PM_REQ_GETQSIZ, /* ARG: int 63 * Get maxmum device queue size in bytes. 64 * If acntl() returns -1, 65 * timidity automatically estimate the size 66 * using adhoc implementation. 67 * This request is used for trace mode. 68 */ 69 70 PM_REQ_SETQSIZ, /* ARG: int (in-out) 71 * Set maxmum device queue size in bytes. 72 * The specified ARG is updated new queue size. 73 */ 74 75 PM_REQ_GETFRAGSIZ, /* ARG: int 76 * Get device fragment size in bytes. 77 */ 78 79 PM_REQ_RATE, /* ARG: int 80 * Change the sample rate. 81 */ 82 83 PM_REQ_GETSAMPLES, /* ARG: int 84 * Get the current play samples. 85 * Play samples must be initialized to zero if 86 * PM_REQ_DISCARD/PM_REQ_FLUSH/PM_REQ_PLAY_START 87 * request is receved. 88 */ 89 90 PM_REQ_PLAY_START, /* ARG: not-used 91 * PM_REQ_PLAY_START is called just before playing. 92 */ 93 94 PM_REQ_PLAY_END, /* ARG: not-used 95 * PM_REQ_PLAY_END is called just after playing. 96 */ 97 98 PM_REQ_GETFILLABLE, /* ARG: int 99 * Get fillable device queue size 100 */ 101 102 PM_REQ_GETFILLED, /* ARG: int 103 * Get filled device queue size 104 */ 105 106 PM_REQ_OUTPUT_FINISH, /* ARG: not-used 107 * PM_REQ_OUTPUT_FINISH calls just after the last my_vidattr(chtype attrs)108 * output_data(), and TiMidity would into 109 * waiting to flush the audio buffer. 110 */ 111 112 PM_REQ_DIVISIONS, /* ARG: int32* - pointer to divisions number 113 */ 114 }; 115 116 117 /* Flag bits */ 118 #define PF_PCM_STREAM (1u<<0) /* Enable output PCM data */ 119 #define PF_MIDI_EVENT (1u<<1) /* Enable send MIDI event via acntl() */ 120 #define PF_CAN_TRACE (1u<<2) /* Enable realtime tracing */ 121 #define PF_BUFF_FRAGM_OPT (1u<<3) /* Enable set extra_param[0] to specify 122 the number of audio buffer fragments */ 123 #define PF_AUTO_SPLIT_FILE (1u<<4) /* Split PCM files automatically */ 124 #define PF_FILE_OUTPUT (1u<<5) /* Output is to file rather than device */ 125 #define IS_STREAM_TRACE ((play_mode->flag & (PF_PCM_STREAM|PF_CAN_TRACE)) == (PF_PCM_STREAM|PF_CAN_TRACE)) 126 127 typedef struct { 128 int32 rate, encoding, flag; 129 int fd; /* file descriptor for the audio device 130 -1 means closed otherwise opened. It must be -1 by default. */ 131 int32 extra_param[5]; /* System depended parameters 132 e.g. buffer fragments, ... */ 133 char *id_name, id_character; 134 char *name; /* default device or file name */ 135 int (* open_output)(void); /* 0=success, 1=warning, -1=fatal error */ 136 void (* close_output)(void); 137 138 int (* output_data)(char *buf, int32 bytes); 139 /* return: -1=error, otherwise success */ 140 141 int (* acntl)(int request, void *arg); /* see PM_REQ_* above 142 * return: 0=success, -1=fail 143 */ 144 int (* detect)(void); /* 0=not available, 1=available */ 145 } PlayMode; 146 147 extern PlayMode *play_mode_list[], *play_mode; 148 extern PlayMode *target_play_mode; 149 extern int audio_buffer_bits; 150 #define audio_buffer_size (1<<audio_buffer_bits) 151 152 /* Conversion functions -- These overwrite the int32 data in *lp with 153 data in another format */ 154 155 /* 8-bit signed and unsigned*/ 156 extern void s32tos8(int32 *lp, int32 c); 157 extern void s32tou8(int32 *lp, int32 c); 158 159 /* 16-bit */ 160 extern void s32tos16(int32 *lp, int32 c); 161 extern void s32tou16(int32 *lp, int32 c); 162 163 /* 24-bit */ 164 extern void s32tos24(int32 *lp, int32 c); 165 extern void s32tou24(int32 *lp, int32 c); 166 167 /* byte-exchanged 16-bit */ 168 extern void s32tos16x(int32 *lp, int32 c); 169 extern void s32tou16x(int32 *lp, int32 c); 170 171 /* uLaw (8 bits) */ 172 extern void s32toulaw(int32 *lp, int32 c); 173 174 /* aLaw (8 bits) */ 175 extern void s32toalaw(int32 *lp, int32 c); 176 177 extern int32 general_output_convert(int32 *buf, int32 count); 178 extern int validate_encoding(int enc, int include_enc, int exclude_enc); 179 extern int32 apply_encoding(int32 old_enc, int32 new_enc); 180 extern const char *output_encoding_string(int enc); 181 extern int get_encoding_sample_size(int32 enc); 182 183 extern char *create_auto_output_name(const char *input_filename, char *ext_str, char *output_dir, int mode); 184 185 #if defined(__W32__) 186 #define FILE_OUTPUT_MODE O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644 187 #elif defined(__MACOS__) 188 #define FILE_OUTPUT_MODE O_WRONLY|O_CREAT|O_TRUNC 189 #else /* UNIX */ 190 #define FILE_OUTPUT_MODE O_WRONLY|O_CREAT|O_TRUNC, 0644 191 #endif 192 193 #endif /* ___OUTPUT_H_ */ 194 195