LICENSE: CC0 1.0 Universal
[spdif-tools.git] / dts2spdif.c
1 \r
2 #include <stdio.h>\r
3 //#include <stdlib.h>\r
4 //#include <string.h>\r
5 #include <memory.h>\r
6 \r
7 struct WAVEHEADER {\r
8     unsigned long  ChunkID;\r
9     unsigned long  ChunkSize;\r
10     unsigned long  Format;\r
11     unsigned long  SubChunk1ID;\r
12     unsigned long  SubChunk1Size;\r
13     unsigned short AudioFormat;\r
14     unsigned short NumChannels;\r
15     unsigned long  SampleRate;\r
16     unsigned long  ByteRate;\r
17     unsigned short BlockAlign;\r
18     unsigned short BitsPerSample;\r
19     unsigned long  SubChunk2ID;\r
20     unsigned long  SubChunk2Size;\r
21 };\r
22 \r
23 \r
24 unsigned char burst[6144];\r
25 \r
26 FILE *infile, *outfile;\r
27 \r
28 unsigned long bytesread;\r
29 unsigned long pcmbytes;\r
30 unsigned long pcmbytesmultiplier;\r
31 char sampleratecode;\r
32 unsigned long framesize;\r
33 \r
34 struct WAVEHEADER wavhdr = { 0x46464952,\r
35                                                         0,\r
36                                                         0x45564157,\r
37                                                         0x20746D66,\r
38                                                         16,\r
39                                                         1,\r
40                                                         2,\r
41                                                         0,\r
42                                                         0,\r
43                                                         4,\r
44                                                         16,\r
45                                                         0x61746164,\r
46                                                         0 };\r
47 \r
48 unsigned long i;\r
49 char temp;\r
50 \r
51 int main( int argc, char *argv[ ], char *envp[ ] )\r
52 {\r
53         if (argc < 3)\r
54         {\r
55                 printf("Wrong syntax. dts2spdif <In.dts> <Out.wav>.\n");\r
56                 return 0;\r
57         }\r
58 \r
59         infile = fopen(argv[1], "rb");\r
60         outfile = fopen(argv[2], "wb");\r
61         //fseek(outfile, SEEK_SET, 44);\r
62         fwrite (&wavhdr, sizeof(struct WAVEHEADER), 1, outfile);\r
63 \r
64 \r
65         for(;;)\r
66         {\r
67                 memset (burst, 0, 6144);\r
68                 bytesread = fread(burst, 1, 9, infile);\r
69                 if (bytesread < 9)\r
70                 {\r
71                         printf ("EOF reached (Frame Header reading)!\nCurrent position in INFILE: %i\n", ftell(infile));\r
72                         break;\r
73                 }\r
74                 if (((unsigned long*)burst)[0] != 0x0180fe7f)\r
75                 {\r
76                         printf("ERROR: INVALID SYNCWORD !\nCurrent position in INFILE: %i\n", ftell(infile));\r
77                         break;\r
78                 }\r
79                 framesize = (burst[5] & 3);\r
80                 framesize = framesize * 4096;\r
81                 framesize = framesize + (burst[6] * 16);\r
82                 framesize = framesize + ((burst[7] & 240) / 16);\r
83                 framesize = framesize + 1;\r
84 \r
85                 sampleratecode = ((burst[8] & 60) / 4);\r
86 \r
87                 if (wavhdr.SampleRate == 0)\r
88                 {\r
89                                 printf ("First Sampleratecode: %i\n", sampleratecode);\r
90 \r
91                                 switch (sampleratecode)\r
92                                 {\r
93                                 case 1:\r
94                                         pcmbytesmultiplier = 4;\r
95                                 case 2:\r
96                                         pcmbytesmultiplier = 2;\r
97                                 case 3:\r
98                                         pcmbytesmultiplier = 1;\r
99                                         wavhdr.SampleRate = 32000;\r
100                                         wavhdr.ByteRate = 128000;\r
101                                         break;\r
102                                 case 6:\r
103                                         pcmbytesmultiplier = 4;\r
104                                 case 7:\r
105                                         pcmbytesmultiplier = 2;\r
106                                 case 8:\r
107                                         pcmbytesmultiplier = 1;\r
108                                         wavhdr.SampleRate = 44100;\r
109                                         wavhdr.ByteRate = 176000;\r
110                                         break;\r
111                                 case 11:\r
112                                         pcmbytesmultiplier = 4;\r
113                                 case 12:\r
114                                         pcmbytesmultiplier = 2;\r
115                                 case 13:\r
116                                         pcmbytesmultiplier = 1;\r
117                                         wavhdr.SampleRate = 48000;\r
118                                         wavhdr.ByteRate = 192000;\r
119                                         break;\r
120                                 default:\r
121                                         wavhdr.SampleRate = 0;\r
122                                         wavhdr.ByteRate = 0;\r
123                                         printf ("Invalid Sampleratecode ! Aborting process...\n");\r
124                                         break;\r
125                                 }\r
126                 }\r
127 \r
128                 pcmbytes = (burst[4] & 1);\r
129                 pcmbytes = pcmbytes * 64;\r
130                 pcmbytes = pcmbytes + ((burst[5] & 252) / 4);\r
131                 pcmbytes = pcmbytes + 1;\r
132                 pcmbytes = pcmbytes * 128;\r
133                 pcmbytes = pcmbytes * pcmbytesmultiplier;\r
134 \r
135 \r
136                 bytesread = fread (&burst[9], 1, framesize - 9, infile);\r
137                 if ((bytesread + 9) < framesize)\r
138                 {\r
139                         printf ("EOF reached (Burst Reading)!\nCurrent position in INFILE: %i\n", ftell(infile));\r
140                         printf ("Frame size: %i  .. Bytes read: %i\n", framesize, bytesread);\r
141                         break;\r
142                 }\r
143 \r
144                 for (i = 0; i < framesize; i += 2)\r
145                 {\r
146                         temp = burst[i];\r
147                         burst[i] = burst[i + 1];\r
148                         burst[i + 1] = temp;\r
149                 }\r
150 \r
151 \r
152                 fwrite (burst, 1, framesize, outfile);\r
153                 if (pcmbytes > framesize)\r
154                 {\r
155                         fwrite ("", 1, pcmbytes - framesize, outfile);\r
156                 }\r
157                 else\r
158                 {\r
159                         printf("Warning: Frame Size > LPCM Frame Size! Buffer underrun may occur/File damaged?\n");\r
160                         printf("Frame start at INFILE Offset: %i\n", ftell(infile) - framesize);\r
161                 }\r
162         }\r
163 \r
164         printf ("Last Sampleratecode: %i\n", sampleratecode);\r
165 \r
166         wavhdr.SubChunk2Size = (ftell(outfile) - 44);\r
167         wavhdr.ChunkSize = wavhdr.SubChunk2Size + 36;\r
168 \r
169         fseek (outfile, SEEK_SET, 0);\r
170         fwrite (&wavhdr, sizeof(struct WAVEHEADER), 1, outfile);\r
171 \r
172 \r
173         fclose (infile);\r
174         fclose (outfile);\r
175 \r
176         return 0;\r
177 }\r