mirror of
https://github.com/Gigaslav/HL2Overcharged.git
synced 2026-01-01 09:48:38 +03:00
138 lines
3.9 KiB
C++
138 lines
3.9 KiB
C++
/*===============================================================================================
|
|
Offline Decoding Example
|
|
Copyright (c), Firelight Technologies Pty, Ltd 2004-2016.
|
|
|
|
This example shows how decode a file to PCM, without playing it.
|
|
It writes out the data as a raw data file.
|
|
The System::createSound function uses FMOD_OPENONLY so that FMOD does not read any data
|
|
itself.
|
|
If this is uses then it is up to the user to use Sound::readData to get the data out of
|
|
the file and into the destination buffer.
|
|
===============================================================================================*/
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <conio.h>
|
|
|
|
#include "../../api/inc/fmod.hpp"
|
|
#include "../../api/inc/fmod_errors.h"
|
|
|
|
void ERRCHECK(FMOD_RESULT result)
|
|
{
|
|
if (result != FMOD_OK)
|
|
{
|
|
printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
|
|
exit(-1);
|
|
}
|
|
}
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
FMOD::System *system;
|
|
FMOD::Sound *sound;
|
|
FMOD_RESULT result;
|
|
unsigned int version;
|
|
|
|
/*
|
|
Create a System object and initialize.
|
|
*/
|
|
result = FMOD::System_Create(&system);
|
|
ERRCHECK(result);
|
|
|
|
result = system->getVersion(&version);
|
|
ERRCHECK(result);
|
|
|
|
if (version < FMOD_VERSION)
|
|
{
|
|
printf("Error! You are using an old version of FMOD %08x. This program requires %08x\n", version, FMOD_VERSION);
|
|
return 0;
|
|
}
|
|
|
|
result = system->init(1, FMOD_INIT_NORMAL, 0);
|
|
ERRCHECK(result);
|
|
|
|
result = system->createStream("../media/wave.mp3", FMOD_OPENONLY | FMOD_ACCURATETIME, 0, &sound);
|
|
ERRCHECK(result);
|
|
|
|
printf("===============================================================================\n");
|
|
printf("Offline Decoding Example. Copyright (c) Firelight Technologies 2004-2016.\n");
|
|
printf("===============================================================================\n");
|
|
printf("\n");
|
|
printf("This program will open wave.mp3 and decode it into wave.raw using the\n");
|
|
printf("Sound::readData function.\n");
|
|
printf("\n");
|
|
|
|
/*
|
|
Decode the sound and write it to a .raw file.
|
|
*/
|
|
{
|
|
void *data;
|
|
unsigned int length = 0, read;
|
|
unsigned int bytesread;
|
|
FILE *outfp;
|
|
|
|
#define CHUNKSIZE 4096
|
|
|
|
result = sound->getLength(&length, FMOD_TIMEUNIT_PCMBYTES);
|
|
ERRCHECK(result);
|
|
|
|
outfp = fopen("output.raw", "wb");
|
|
if (!outfp)
|
|
{
|
|
printf("Error! Could not open output.raw output file.\n");
|
|
return 0;
|
|
}
|
|
|
|
data = malloc(CHUNKSIZE);
|
|
if (!data)
|
|
{
|
|
printf("Error! Failed to allocate %d bytes.\n", CHUNKSIZE);
|
|
return 0;
|
|
}
|
|
|
|
bytesread = 0;
|
|
do
|
|
{
|
|
result = sound->readData((char *)data, CHUNKSIZE, &read);
|
|
|
|
fwrite((char *)data, read, 1, outfp);
|
|
|
|
bytesread += read;
|
|
|
|
printf("writing %d bytes of %d to output.raw\r", bytesread, length);
|
|
}
|
|
while (result == FMOD_OK && read == CHUNKSIZE);
|
|
|
|
/*
|
|
Loop terminates when either
|
|
1. the read function returns an error. (ie FMOD_ERR_FILE_EOF etc).
|
|
2. the amount requested was different to the amount returned. (somehow got an EOF without the file error, maybe a non stream file format like mod/s3m/xm/it/midi).
|
|
|
|
If 'bytesread' is bigger than 'length' then it just means that FMOD miscalculated the size,
|
|
but this will not usually happen if FMOD_ACCURATETIME is used. (this will give the correct length for VBR formats)
|
|
*/
|
|
|
|
printf("\n");
|
|
|
|
if (outfp)
|
|
{
|
|
fclose(outfp);
|
|
}
|
|
}
|
|
|
|
|
|
printf("\n");
|
|
|
|
/*
|
|
Shut down
|
|
*/
|
|
result = sound->release();
|
|
ERRCHECK(result);
|
|
result = system->close();
|
|
ERRCHECK(result);
|
|
result = system->release();
|
|
ERRCHECK(result);
|
|
|
|
return 0;
|
|
}
|