OSDN Git Service

* Support for Japanese-MetaText output by libiconv
[playumidi/playumidi.git] / src / main.c
1 /*MIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDI
2
3                            P L A Y U M I D I
4                   (/dev/umixiX.Y Direct MIDI Player)
5
6    Copyright(C) 2014 Koine Yuusuke(koinec). All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
11  1. Redistributions of source code must retain the above copyright notice,
12     this list of conditions and the following disclaimer.
13  2. Redistributions in binary form must reproduce the above copyright
14     notice, this list of conditions and the following disclaimer in the
15     documentation and/or other materials provided with the distribution.
16
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 MIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDI*/
30
31 #define PLAYUMIDI_SRC_MAIN
32
33 #include<stdio.h>
34 #include<stdlib.h>
35 #include<string.h>
36 #include<signal.h>
37 #include<unistd.h>
38 #include<errno.h>
39 #include<pthread.h>
40 #include"playumidi.h"
41
42
43 char    *gpstr_smfname;
44 char    *gpstr_devname;
45 char    *gpstr_mididev[MAX_UMIDI_PORT];
46 char    *gpstr_lang_smf[30];
47 char    *gpstr_lang_terminal[30];
48
49
50 /* ===================================================================*/
51 void Signal_Int(
52                 int     i_signal )      {
53
54         Play_RequestStop();
55         return;
56 }
57
58
59 /* ===================================================================*/
60 int Play_SMF(
61                 void )  {
62
63         int                     i_result        = 0x00;
64         int                     i_err;
65         sig_t           t_sigerr;
66         pthread_t       t_thread;
67         char            str_default_devname[6]  = DEFAULT_DEV_NAME;
68
69         MSleep_Ajust();
70
71         if( NULL == gpstr_devname )
72                 { gpstr_devname = str_default_devname; }
73         i_err   = MidiDevice_Init( gpstr_devname, gpstr_mididev );
74         if( 0x00 != i_err )             { return i_err; }
75
76         t_sigerr        = signal( SIGINT, (void (*))Signal_Int );
77         if( SIG_ERR == t_sigerr )       {
78                 i_result        = -0x01;
79                 fprintf(stderr, "Error!!: Can't Set Signal(SIGINT) (%d)\n", errno);
80                 goto goto_Play_SMF_TermDevice;
81         }
82
83         i_err   = PlayEvent_Initialize();
84         if( 0x00 != i_err )             {
85                 i_result        = i_err;
86                 goto goto_Play_SMF_TermDevice;
87         }
88
89         i_err   = ReadSMF( gpstr_smfname );
90         if( 0x00 != i_err )             {
91                 i_result        = i_err;
92                 goto goto_Play_SMF_TermPlayEvnet;
93         }
94
95         i_err   = pthread_create( &t_thread, NULL,
96                                                 (void *)PlayEvent_Play, (void *)NULL );
97         if( 0x00 != i_err )     {
98                 i_result        = -0x02;
99                 fprintf(stderr, "Error!!: Can't Create Player-Thread (%d)\n", errno);
100         }
101         else    {
102                 pthread_join( t_thread, NULL );
103         }
104
105         MidiEvent_FreeMidiVarData();
106         MidiEvent_FreeMidiEvnetInfo();
107         
108 goto_Play_SMF_TermPlayEvnet:
109         PlayEvent_Term();
110
111 goto_Play_SMF_TermDevice:
112         MidiDevice_Term();
113
114         return 0x00;
115 }
116
117
118 /* ===================================================================*/
119 void
120         Copyright(
121                 void )  {
122         
123         fputs( "playumidi: Simple MIDI-File Player for RAW-MIDI Interface(USB MIDI). "
124                         STRING_VERSION "\n", stderr );
125         fputs( " Copyright(C) 2014- Koine Yuusuke(koinec@users.sourceforge.jp).\n",
126                         stderr );
127         fputs( " This software presented by 2-clause FreeBSD License.\n\n", stderr );
128
129         return;
130 }
131
132
133 /* ===================================================================*/
134 void
135         Usage(
136                 void )  {
137
138         fputs( "usage: playumidi [option] MIDIfile(.mid)\n", stderr );
139         fputs( "  -d device_name      Use RAW-MIDI device /dev/[device_name]X.Y"
140                         " (X & Y is auto-serarch)\n", stderr );
141         fputs( "  -0 device_fullname  Use Port-0 RAW-MIDI device /dev/[device_fullname]\n", stderr );
142         fputs( "  -1 device_fullname  Use Port-1 RAW-MIDI device /dev/[device_fullname]\n", stderr );
143         fputs( "  -2 device_fullname  Use Port-2 RAW-MIDI device /dev/[device_fullname]\n", stderr );
144         fputs( "  -3 device_fullname  Use Port-3 RAW-MIDI device /dev/[device_fullname]\n", stderr );
145         fputs( "  -r                  Not auto-append XG/GS/GM REST code\n", stderr );
146         fputs( "  -q                  Quiet mode (No output Meta-Event Text for console)\n", stderr );
147         fputs( "  -v                  Verbose mode\n", stderr );
148 #ifdef SUPPORT_JAPANESE
149         fputs( "  -l                  MIDI file Language-Code (sjis/euc/utf8 only)\n", stderr );
150         fputs( "  -t                  Output Text Language-Code (sjis/euc/utf8 only)\n", stderr );
151 #endif
152         fputs( "  -h                  Help (This Message)\n", stderr );
153
154         return;
155 }
156
157
158 /* ===================================================================*/
159 int main(
160                 int argc,
161                 char *argv[] )  {
162
163         int                                     i_ch;
164         extern          char    *optarg;
165         extern          int             optind;
166         extern          int             opterr;
167
168         Copyright();
169
170         gpstr_devname           = NULL;
171         gpstr_mididev[0]        = NULL;
172         gpstr_mididev[1]        = NULL;
173         gpstr_mididev[2]        = NULL;
174         gpstr_mididev[3]        = NULL;
175         gb_mode                         = MODE_DEFAULT;
176
177         while( -1 != (i_ch = getopt( argc, argv, "d:0:1:2:3:vqrh")))    {
178                 if( 'd' == i_ch )
179                         { gpstr_devname = optarg; }
180                 else if( '0' == i_ch )
181                         { gpstr_mididev[0]      = optarg; }
182                 else if( '1' == i_ch )
183                         { gpstr_mididev[1]      = optarg; }
184                 else if( '2' == i_ch )
185                         { gpstr_mididev[2]      = optarg; }
186                 else if( '3' == i_ch )
187                         { gpstr_mididev[3]      = optarg; }
188                 else if( 'v' == i_ch )
189                         { gb_mode       |= MODE_VERBOSE; }
190                 else if( 'q' == i_ch )
191                         { gb_mode       |= MODE_QUIET; }
192                 else if( 'r' == i_ch )
193                         { gb_mode       |= MODE_NORESET; }
194                 else if( 'h' == i_ch )  {
195                         Usage();
196                         return 0x00;
197                 }
198                 else    {
199                         Usage();
200                         return 0x01;
201                 }
202         }
203         argc    -= optind;
204         argv    += optind;
205
206         if( 1 != argc )         {
207                 Usage();
208                 return 0x01;
209         }
210         gpstr_smfname   = argv[0];
211         if( IS_MSGVERBOSE )     
212                 { printf( "  [MIDI File ]: %s\n", gpstr_smfname ); }
213
214 #ifdef SUPPORT_JAPANESE
215         gt_iconv        = iconv_open( DEFAULT_TERM_LANGCODE, DEFAULT_SMF_LANGCODE );
216         if( (iconv_t)(-1) == gt_iconv )         {
217                 fprintf(stderr, "Error!!: Can't Initialize libiconv (%d)\n", errno);
218                 return 0x01;
219         }
220 #endif
221
222         Play_SMF();
223
224 #ifdef SUPPORT_JAPANESE
225         iconv_close( gt_iconv );
226 #endif
227
228         return 0x00;
229 }
230
231
232 /* EOF of main.c ******************************************************/