1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
#include <stdio.h>
#include <stdlib.h>
#include "fmod.h"
typedef struct {
signed char id[4];
int Size;
} RiffChunk;
struct {
RiffChunk Chunk;
unsigned short wFormatTag;
unsigned short nChannels;
unsigned int nSamplesPerSec;
unsigned int nAvgBytesPerSec;
unsigned short nBlockAlign;
unsigned short wBitsPerSample;
} FmtChunk = { {{'f','m','t',' '}, sizeof(FmtChunk) - sizeof(RiffChunk) }, 1, 2, 44100, 44100 * 2 * 16 / 8, 1 * 2 * 16 / 8, 16 };
struct {
RiffChunk Chunk;
} DataChunk = { {{'d','a','t','a'}, 0 } };
struct {
RiffChunk Chunk;
signed char RiffType[4];
} WavHeader = { {{'R','I','F','F'}, 0 }, {'W','A','V','E'} };
signed char g_StreamEnded;
unsigned int g_BytesWritten;
//------------------------------------------------------------------------------------------------------
signed char F_CALLBACKAPI EndCallback(FSOUND_STREAM *Stream, void *Buffer, int iLength, void *Param)
{
g_StreamEnded = 1;
return 1;
}
//------------------------------------------------------------------------------------------------------
void *F_CALLBACKAPI DSP_RawWriteCallback(void *OriginalBuffer, void *NewBuffer, int iLength, void *Param)
{
if(!g_StreamEnded){
fwrite(NewBuffer, 1, (iLength << 2), Param);
g_BytesWritten += (iLength << 2);
}
return NewBuffer;
}
//------------------------------------------------------------------------------------------------------
int ConvToWav(const char *in, const char *out)
{
int r = 0;
char *data;
long filesize;
FILE *f_in, *f_out;
FSOUND_STREAM *stream;
FSOUND_DSPUNIT *rawwrite_dsp;
FSOUND_SetOutput(FSOUND_OUTPUT_NOSOUND_NONREALTIME);
if(FSOUND_GetVersion() < FMOD_VERSION)
return r;
if(!FSOUND_Init(44100, 32, 0))
return r;
if((f_in = fopen(in, "rb")))
{
if((f_out = fopen(out, "wb")))
{
fseek(f_in, 0L, SEEK_END);
filesize = ftell(f_in);
fseek(f_in, 0L, SEEK_SET);
if((data = malloc(filesize)))
{
FSOUND_Stream_SetBufferSize(2000);
fseek(f_out, sizeof(WavHeader) + sizeof(FmtChunk) + sizeof(DataChunk), SEEK_SET);
rawwrite_dsp = FSOUND_DSP_Create(&DSP_RawWriteCallback, FSOUND_DSP_DEFAULTPRIORITY_USER, f_out);
FSOUND_DSP_SetActive(rawwrite_dsp, 1);
fread(data, filesize, 1, f_in);
if((stream = FSOUND_Stream_Open(data, FSOUND_NORMAL | FSOUND_MPEGACCURATE | FSOUND_LOADMEMORY, 0, filesize)))
{
FSOUND_Stream_SetEndCallback(stream, EndCallback, 0);
FSOUND_Stream_Play(FSOUND_FREE, stream);
do
FSOUND_Update();
while(!g_StreamEnded);
WavHeader.Chunk.Size = sizeof(FmtChunk) + sizeof(RiffChunk) + g_BytesWritten;
DataChunk.Chunk.Size = g_BytesWritten;
fseek(f_out, 0, SEEK_SET);
fwrite(&WavHeader, 1, sizeof(WavHeader), f_out);
fwrite(&FmtChunk, 1, sizeof(FmtChunk), f_out);
fwrite(&DataChunk, 1, sizeof(DataChunk), f_out);
FSOUND_Stream_Close(stream);
r = 1;
}
FSOUND_DSP_SetActive(rawwrite_dsp, 0);
FSOUND_DSP_Free(rawwrite_dsp);
free(data);
}
fclose(f_out);
}
fclose(f_in);
}
g_BytesWritten = 0;
g_StreamEnded = 0;
FSOUND_Close();
return r;
}
//------------------------------------------------------------------------------------------------------
int main(void)
{
printf("Conversion: %s\n", ConvToWav("test.mp3", "test.wav") ? "Ok" : "Echec !");
return 0;
} |
Partager