ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SIDPlayer/src/main_sdl.cpp
Revision: 1.10
Committed: 2001-05-22T20:01:34Z (22 years, 10 months ago) by cebix
Branch: MAIN
Changes since 1.9: +3 -1 lines
Log Message:
--speed option had no effect

File Contents

# User Rev Content
1 cebix 1.1 /*
2     * main_sdl.cpp - SIDPlayer SDL main program
3     *
4 cebix 1.6 * SIDPlayer (C) Copyright 1996-2001 Christian Bauer
5 cebix 1.1 *
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    
21     #include "sys.h"
22    
23     #include <SDL.h>
24 cebix 1.9 #include <SDL/SDL_endian.h>
25    
26 cebix 1.1 #include <stdio.h>
27     #include <stdlib.h>
28 cebix 1.9 #include <errno.h>
29 cebix 1.1
30     #include "main.h"
31 cebix 1.4 #include "prefs.h"
32     #include "sid.h"
33 cebix 1.1
34    
35     /*
36     * Main program
37     */
38    
39     static void usage(const char *prg_name)
40     {
41 cebix 1.7 printf("Usage: %s [OPTION...] FILE [song_number]\n", prg_name);
42 cebix 1.5 PrefsPrintUsage();
43 cebix 1.1 exit(0);
44     }
45    
46     static void quit(void)
47     {
48     ExitAll();
49     SDL_Quit();
50     }
51    
52     int main(int argc, char **argv)
53     {
54     // Print banner
55     printf(
56     PACKAGE " Version " VERSION "\n\n"
57 cebix 1.5 "Copyright (C) 1996-2001 Christian Bauer\n"
58 cebix 1.1 "E-mail: Christian.Bauer@uni-mainz.de\n"
59     "http://www.uni-mainz.de/~bauec002/\n\n"
60     "This is free software with ABSOLUTELY NO WARRANTY.\n"
61     "You are welcome to redistribute it under certain conditions.\n"
62     "For details, see the file COPYING.\n\n"
63     );
64    
65 cebix 1.5 // Initialize everything
66     if (SDL_Init(SDL_INIT_AUDIO) < 0) {
67     fprintf(stderr, "Couldn't initialize SDL (%s)\n", SDL_GetError());
68     exit(1);
69     }
70     atexit(quit);
71     InitAll(argc, argv);
72 cebix 1.10 int32 speed = PrefsFindInt32("speed");
73 cebix 1.5
74     // Parse non-option arguments
75 cebix 1.8 const char *file_name = NULL;
76 cebix 1.1 int song = 0;
77 cebix 1.8 for (int i=1; i<argc; i++) {
78     if (strcmp(argv[i], "--help") == 0)
79     usage(argv[0]);
80     else if (argv[i][0] == '-') {
81     fprintf(stderr, "Unrecognized option '%s'\n", argv[i]);
82     usage(argv[0]);
83     } else {
84     if (file_name == NULL)
85     file_name = argv[i]; // First non-option argument is file name
86     else
87     song = atoi(argv[i]); // Second non-option argument is song number
88 cebix 1.3 }
89     }
90 cebix 1.8 if (file_name == NULL)
91     usage(argv[0]);
92 cebix 1.1
93     // Load given PSID file
94 cebix 1.3 if (!LoadPSIDFile(file_name)) {
95     fprintf(stderr, "Couldn't load '%s' (not a PSID file?)\n", file_name);
96 cebix 1.1 exit(1);
97     }
98    
99     // Select song
100     if (song > 0) {
101     if (song > number_of_songs)
102     song = number_of_songs;
103     SelectSong(song - 1);
104     }
105 cebix 1.10
106     SIDAdjustSpeed(speed); // SelectSong and LoadPSIDFile() reset this to 100%
107 cebix 1.1
108     // Print file information
109     printf("Module Name: %s\n", module_name);
110     printf("Author : %s\n", author_name);
111     printf("Copyright : %s\n\n", copyright_info);
112     printf("Playing song %d/%d\n", current_song + 1, number_of_songs);
113    
114 cebix 1.9 // Replay or output to file?
115     const char *outfile = PrefsFindString("outfile");
116     if (outfile) {
117    
118     // Open file
119     SDL_RWops *f = SDL_RWFromFile(outfile, "wb");
120     if (f == NULL) {
121     fprintf(stderr, "Can't open '%s' for writing (%s)\n", outfile, strerror(errno));
122     exit(1);
123     }
124    
125     // Get format information
126     int32 channels = (PrefsFindBool("stereo") ? 2 : 1);
127     int32 bits = (PrefsFindBool("audio16bit") ? 16 : 8);
128     int32 rate = PrefsFindInt32("samplerate");
129     int32 time = PrefsFindInt32("time");
130     int32 bytes_per_frame = channels * (bits / 8);
131     int32 bytes_per_second = rate * bytes_per_frame;
132     int32 data_length = time * bytes_per_second;
133    
134     // Write header
135     SDL_WriteLE32(f, 0x46464952); // "RIFF"
136     SDL_WriteLE32(f, 36 + data_length);
137     SDL_WriteLE32(f, 0x45564157); // "WAVE"
138     SDL_WriteLE32(f, 0x20746D66); // "fmt "
139     SDL_WriteLE32(f, 16);
140     SDL_WriteLE16(f, 1);
141     SDL_WriteLE16(f, channels);
142     SDL_WriteLE32(f, rate);
143     SDL_WriteLE32(f, bytes_per_second);
144     SDL_WriteLE16(f, bytes_per_frame);
145     SDL_WriteLE16(f, bits);
146     SDL_WriteLE32(f, 0x61746164); // "data"
147     SDL_WriteLE32(f, data_length);
148    
149     // Calculate sound and write to file
150     uint8 *buf = new uint8[bytes_per_second];
151     for (int i=0; i<time; i++) {
152     SIDCalcBuffer(buf, bytes_per_second);
153     #if SDL_BYTEORDER == SDL_BIG_ENDIAN
154     if (bits > 8) {
155     // WAV file is little-endian, swap audio data
156     for (int b=0; b<bytes_per_second; b+=2) {
157     uint8 tmp = buf[b];
158     buf[b] = buf[b+1];
159     buf[b+1] = tmp;
160     }
161     }
162     #endif
163     SDL_RWwrite(f, buf, bytes_per_second, 1);
164     }
165     delete[] buf;
166    
167     // Close file
168     SDL_RWclose(f);
169     printf("Output written to '%s'\n", outfile);
170    
171     } else {
172    
173     // Start replay and enter main loop
174     SDL_PauseAudio(false);
175     while (true) {
176     SDL_Event e;
177     if (SDL_WaitEvent(&e)) {
178     if (e.type == SDL_QUIT)
179     break;
180     }
181 cebix 1.1 }
182     }
183    
184     return 0;
185     }