ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SIDPlayer/src/main_sdl.cpp
(Generate patch)

Comparing SIDPlayer/src/main_sdl.cpp (file contents):
Revision 1.4 by cebix, 2001-01-16T14:12:54Z vs.
Revision 1.9 by cebix, 2001-04-01T17:04:43Z

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines