All pastes #91606 Raw Edit

Mine

public text v1 · immutable
#91606 ·published 2006-07-18 19:24 UTC
rendered paste body
#include <stdio.h>

#include <string.h>



double f[5][2] = { { 0.0, 0.0 },

                    {   60.0 / 64.0,  0.0 },

                    {  115.0 / 64.0, -52.0 / 64.0 },

                    {   98.0 / 64.0, -55.0 / 64.0 },

                    {  122.0 / 64.0, -60.0 / 64.0 } };



double samples[28];



int main( int argc, char *argv[] )

{

    FILE *vag, *pcm;

    char fname[128];

    char *p;

    int predict_nr, shift_factor, flags;

    int i;

    int d, s;

    static double s_1 = 0.0;

    static double s_2 = 0.0;

        

    if ( argc != 2 ) {

        printf( "usage: depack *.vag\n" );

        return( -1 );

    }

    

    vag = fopen( argv[1], "rb" );

    fseek( vag, 64, SEEK_SET );



    strcpy( fname, argv[1] );

    p = strrchr( fname, '.' );

    p++;

    strcpy( p, "PCM" );

    pcm = fopen( fname, "wb" );

    if ( vag == NULL ) {

        printf( "can´t write output file\n" );

        return( -8 );

    }









    while( 1 ) {

        predict_nr = fgetc( vag );

        shift_factor = predict_nr & 0xf;

        predict_nr >>= 4;

        flags = fgetc( vag );                           // flags

        if ( flags == EOF )

            break;              

        for ( i = 0; i < 28; i += 2 ) {

            d = fgetc( vag );

            s = ( d & 0xf ) << 12;

            if ( s & 0x8000 )

                s |= 0xffff0000;

            samples[i] = (double) ( s >> shift_factor  );

            s = ( d & 0xf0 ) << 8;

            if ( s & 0x8000 )

                s |= 0xffff0000;

            samples[i+1] = (double) ( s >> shift_factor  );

        }

    

        for ( i = 0; i < 28; i++ ) {

            samples[i] = samples[i] + s_1 * f[predict_nr][0] + s_2 * f[predict_nr][1];

            s_2 = s_1;

            s_1 = samples[i];

            d = (int) ( samples[i] + 0.5 );

            fputc( d & 0xff, pcm );

            fputc( d >> 8, pcm );

        }

    }

    

    fclose( pcm );

    fclose( vag );

    return( 0 );

}