一個更簡單的方法,不使用Frame,而是直接用Read方式;順便也修改幾個不對的地方。這種Decode方式更符合DSound的需要。主要改動如下:
1 while(true)
2 {
3 ret = mpg123_init();
4 if(ret != MPG123_OK)
5 break;
6 mpg123_handle *h = mpg123_new(NULL, &ret);
7 if(h == NULL)
8 break;
9 ret = mpg123_open(h, ".\\orgrimmar_intro-moment.mp3");
10 if(ret != MPG123_OK)
11 break;
12
13 long rate = 0;
14 int channel = 0, encoding = 0;
15 ret = mpg123_getformat(h, &rate, &channel, &encoding);
16 if(ret != MPG123_OK)
17 break;
18 if((encoding & MPG123_ENC_16) == MPG123_ENC_16)
19 encoding = 16;
20 else if((encoding & MPG123_ENC_32) == MPG123_ENC_32)
21 encoding = 32;
22 else
23 encoding = 8;
24
25 WAVE_HEADER header;
26 InitWaveHeader(header, channel, rate, encoding, 0);
27
28 UpdateWaveHeader(header, true);
29
30 unsigned char buffer[32 * 1024];
31 size_t size = 32 * 1024;
32 size_t outsize = 0;
33
34 do
35 {
36 ret = mpg123_read(h, buffer, size, &outsize);
37 header.data_size += outsize;
38
39 AppendWaveData((const char*)buffer, outsize);
40
41 }while(ret == MPG123_OK);
42
43 mpg123_close(h);
44 mpg123_delete(h);
45 mpg123_exit();
46
47 header.waveform_chunk_size = header.data_size + 36;
48
49 UpdateWaveHeader(header, false);
50
51
52 break;
53 }
54
55 if(ret != MPG123_OK && ret != MPG123_DONE)
56 {
57 std::cout << "error : " << mpg123_plain_strerror(ret) << std::endl;
58 return -1;
59 }
60
61 CloseWaveFile();