Top secrets sources NedoPC pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

#include "std.h"

#include "resource.h"

#include "emul.h"
#include "vars.h"
#include "dx.h"
#include "memory.h"
#include "savesnd.h"

#include "util.h"

//=============================================================================
static unsigned char wavhdr[]=
{
    0x52, 0x49, 0x46, 0x46, 0xCC, 0xF6, 0x3E, 0x00,
    0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,
    0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00,
    0x22, 0x56, 0x00, 0x00, 0x88, 0x58, 0x01, 0x00,
    0x04, 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61,
    0xA8, 0xF6, 0x3E, 0x00
};
//=============================================================================
#pragma pack( push, 1)
//=============================================================================
static struct
{
    unsigned short sig;
    unsigned char stereo;
    unsigned short start;
    unsigned ayfq;
    unsigned char intfq;
    unsigned short year;
    unsigned rawsize;
} vtxheader;
//=============================================================================
#pragma pack( pop)
//=============================================================================
static bool silence(unsigned pos)
{
    return !(vtxbuf[ pos+8] | vtxbuf[ pos+9] | vtxbuf[ pos+10]) ||
            (vtxbuf[ pos+7] & 0x3F) == 0x3F;
}
//=============================================================================
INT_PTR CALLBACK VtxDlg( HWND dlg, UINT msg, WPARAM wp, LPARAM lp);
//=============================================================================
static unsigned vtxyear;
static unsigned vtxchip;
static char vtxname[200];
static char vtxauthor[200];
static char vtxsoft[200];
static char vtxtracker[200];
static char vtxcomm[200];
//=============================================================================



//=============================================================================
void savesnddialog()
{
    OnEnterGui();       //Alone Coder
    unsigned end;       //Alone Coder 0.36.7
   
    //-------------------------------------------------------------------------
    if (savesndtype)
    {
        //---------------------------------------------------------------------
        // wave
        if (savesndtype == 1)
        {
            unsigned fsize = unsigned( ftell( savesnd));
            fseek( savesnd, 0, SEEK_SET);
            fsize -= sizeof wavhdr;
            *(unsigned*)(wavhdr + 4) = fsize + 0x2c - 8;
            *(unsigned*)(wavhdr + 0x28) = fsize;
            fwrite( wavhdr, 1, sizeof wavhdr, savesnd);
            MessageBox( wnd, "WAV save done", "Save sound", MB_ICONINFORMATION);
        }
        //---------------------------------------------------------------------
        // vtx
        else
        {
            savesndtype = 0;
            unsigned char *newb = (unsigned char*)malloc( vtxbuffilled);
            //-----------------------------------------------------------------
            for (/*unsigned*/ end = 0;    end < vtxbuffilled && silence( end);    end += 14);
            //-----------------------------------------------------------------
            vtxbuffilled -= end;
            memcpy( vtxbuf, vtxbuf + end, vtxbuffilled);
            //-----------------------------------------------------------------
            for (end = vtxbuffilled;    end && silence( end - 14);    end -= 14);
            //-----------------------------------------------------------------
            vtxbuffilled = end;
            int nrec = vtxbuffilled / 14;
            //-----------------------------------------------------------------
            for (int i = 0;    i < nrec;    i++)
            {
                //-------------------------------------------------------------
                for (int j = 0;    j < 14;    j++)
                {
                    newb[ j * nrec + i] = vtxbuf[ i * 14 + j];
                }
                //-------------------------------------------------------------
            }
            //-----------------------------------------------------------------
            free( vtxbuf);
            FILE *ff = fopen( "vtx.tmp", "wb");
            //-----------------------------------------------------------------
            if (!ff)
                goto save_sound_exit;
                //return;
            //-----------------------------------------------------------------
            fwrite( newb, 1, vtxbuffilled, ff);
            fclose( ff);
            STARTUPINFO si = { sizeof si };
            si.dwFlags = STARTF_USESHOWWINDOW;
            si.wShowWindow = SW_HIDE;
            PROCESS_INFORMATION pi;
            char Parh[] = "lha a vtx.lzh vtx.tmp";
            //-----------------------------------------------------------------
            if ( CreateProcess(         nullptr,
                                        Parh,
                                        nullptr,
                                        nullptr,
                                        0,
                                        0,
                                        nullptr,
                                        nullptr,
                                        &si,
                                        &pi
                                )
             )
            {
                WaitForSingleObject( pi.hProcess, 5000);
                CloseHandle( pi.hProcess);
                CloseHandle( pi.hThread);
                DeleteFile( "vtx.tmp");
            }
            //-----------------------------------------------------------------
            else
            {
                DeleteFile( "vtx.tmp");
                MessageBox(     wnd,
                                "LHA.EXE not found in %PATH%",
                                nullptr,
                                MB_ICONERROR
                        );
                goto save_sound_exit;
                //return;
            }
            //-----------------------------------------------------------------
            ff = fopen( "vtx.lzh", "rb");
            //-----------------------------------------------------------------
            if (!ff)
                goto save_sound_exit;
                //return;
            //-----------------------------------------------------------------v
            fseek( ff, 0x22, SEEK_SET);
            size_t packed = fread( newb, 1, vtxbuffilled, ff) - 1;
            fclose( ff);
            DeleteFile( "vtx.lzh");
            DialogBox( hIn, MAKEINTRESOURCE( IDD_VTX), wnd, VtxDlg);
            vtxheader.sig = (vtxchip & 1)  ?  WORD2( 'y','m') :
                                              WORD2( 'a','y');
            static unsigned char ste[] = { 1, 2, 0 };
            vtxheader.stereo = ste[ vtxchip / 2];
            vtxheader.ayfq = conf.sound.ayfq;
            vtxheader.intfq = 50;       // хотя для совместимости
                                        // наверно стоит оставить 50       
            vtxheader.year = u16( vtxyear);
            vtxheader.rawsize = vtxbuffilled;
            fwrite( &vtxheader, 1, 0x10,                        savesnd);
            fwrite( vtxname,    1, strlen( vtxname) + 1,        savesnd);
            fwrite( vtxauthor,  1, strlen( vtxauthor) + 1,      savesnd);
            fwrite( vtxsoft,    1, strlen( vtxsoft) + 1,        savesnd);
            fwrite( vtxtracker, 1, strlen( vtxtracker) + 1,     savesnd);
            fwrite( vtxcomm,    1, strlen( vtxcomm) + 1,        savesnd);
            fwrite( newb,       1, packed,                      savesnd);
        }
        //---------------------------------------------------------------------
        fclose( savesnd);
        savesndtype = 0;
    }
    //-------------------------------------------------------------------------
    else
    {
        OPENFILENAME ofn = { };
        char sndsavename[0x200];
        *sndsavename = 0;

        ofn.lStructSize = (WinVerMajor < 5)  ?  OPENFILENAME_SIZE_VERSION_400 :
                                                sizeof( OPENFILENAME);
        ofn.lpstrFilter = "All sound (WAV)\0*.wav\0AY sound (VTX)\0*.vtx\0";
        ofn.lpstrFile = sndsavename;
        ofn.nMaxFile = sizeof sndsavename;
        ofn.lpstrTitle = "Save Sound";
        ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
        ofn.hwndOwner = wnd;
        ofn.nFilterIndex = 1;
        //---------------------------------------------------------------------
        if (GetSaveFileName( &ofn))
        {
            char *name = sndsavename;
            //-----------------------------------------------------------------
            for (char *x = name;    *x;    x++)
                if (*x == '\\')
                    name = x + 1;
            //-----------------------------------------------------------------
            if (!strchr( name, '.'))
            {
                //-------------------------------------------------------------
                if (ofn.nFilterIndex == 1)
                {
                    strcat( sndsavename, ".wav");
                }
                //-------------------------------------------------------------
                else
                {
                    strcat( sndsavename, ".vtx");
                }
                //-------------------------------------------------------------
            }
            //-----------------------------------------------------------------
            savesnd = fopen( ofn.lpstrFile, "wb");
            //-----------------------------------------------------------------
            if (!savesnd)
            {
                MessageBox( wnd, "Can't create file", nullptr, MB_ICONERROR);
            }
            //-----------------------------------------------------------------
            // vtx
            else if (ofn.nFilterIndex == 2)
            {
                savesndtype = 2;
                vtxbuf = nullptr;
            }
            //-----------------------------------------------------------------
            // wave. all params, except fq are fixed: 16bit,stereo
            else
            {
                *(unsigned*)(wavhdr + 0x18) = conf.sound.fq;            // fq
                *(unsigned*)(wavhdr + 0x1C) = conf.sound.fq * 4;        // bitrate
                fwrite( wavhdr, 1, 44, savesnd);                        // header
                savesndtype = 1;
            }
            //-----------------------------------------------------------------
        }
        //---------------------------------------------------------------------
    }
    //-------------------------------------------------------------------------

save_sound_exit:

/*
    // вынесено в WM_INITMENU
    //-------------------------------------------------------------------------
    HMENU main_menu = GetMenu( wnd);
    //-------------------------------------------------------------------------
    if (main_menu)
    {
        //---------------------------------------------------------------------
        // запись пошла и ее можно остановить
        if (savesndtype)
        {
            ModifyMenu(     main_menu,
                            IDM_AUDIOREC,
                            MF_BYCOMMAND | MF_STRING,
                            IDM_AUDIOREC,
                            "Stop Audio Recording"
                        );
        }
        //---------------------------------------------------------------------
        // запись можно начать
        else
        {
            ModifyMenu(     main_menu,
                            IDM_AUDIOREC,
                            MF_BYCOMMAND | MF_STRING,
                            IDM_AUDIOREC,
                            "Start Audio Recording"
                        );
        }
        //---------------------------------------------------------------------
    }
*/

    //-------------------------------------------------------------------------
    eat();
    OnExitGui();        //Alone Coder
}
//=============================================================================



//=============================================================================
INT_PTR CALLBACK VtxDlg(HWND dlg, UINT msg, WPARAM wp, LPARAM lp)
{
    (void)lp;
    //-------------------------------------------------------------------------
    if (msg == WM_INITDIALOG)
    {
        static char chips[] = "ABC AY\0ABC YM\0ACB AY\0ACB YM\0MONO AY\0MONO YM\0";
        //-------------------------------------------------------------------------
        for (char *str = chips;    *str;    str += strlen( str) + 1)
            SendDlgItemMessage(     dlg,
                                    IDC_VTXCHIP,
                                    CB_ADDSTRING,
                                    0,
                                    (LPARAM)str
                                );
        //-------------------------------------------------------------------------
        unsigned c = ((conf.sound.ay_voltab[8] == conf.sound.ay_voltab[9])  ?  0:
                                                                               1);
        // убрано из конца unsigned c
        //               + (conf.ay_preset > 2  ?  0:
        //                                           conf.ay_preset * 2)
        //                     
        SendDlgItemMessage(     dlg,
                                IDC_VTXCHIP,
                                CB_SETCURSEL,
                                c,
                                0
                        );
        SetFocus(       GetDlgItem( dlg, IDE_VTXNAME));
        return 1;
    }
    //-------------------------------------------------------------------------
    if (  ((msg == WM_SYSCOMMAND) && ((wp & 0xFFF0) == SC_CLOSE))       ||
          ((msg == WM_COMMAND) && (LOWORD( wp) == IDOK))
     )
    {
        SendDlgItemMessage( dlg, IDE_VTXNAME,  WM_GETTEXT, sizeof vtxname,    (LPARAM)vtxname);
        SendDlgItemMessage( dlg, IDE_VTXAUTH,  WM_GETTEXT, sizeof vtxauthor,  (LPARAM)vtxauthor);
        SendDlgItemMessage( dlg, IDE_VTXSOFT,  WM_GETTEXT, sizeof vtxsoft,    (LPARAM)vtxsoft);
        SendDlgItemMessage( dlg, IDE_VTXTRACK, WM_GETTEXT, sizeof vtxtracker, (LPARAM)vtxtracker);
        SendDlgItemMessage( dlg, IDE_VTXCOMM,  WM_GETTEXT, sizeof vtxcomm,    (LPARAM)vtxcomm);
        vtxchip = unsigned( SendDlgItemMessage( dlg, IDC_VTXCHIP, CB_GETCURSEL, 0, 0));
        char xx[20];
        SendDlgItemMessage( dlg, IDE_VTXYEAR,  WM_GETTEXT, sizeof xx,         (LPARAM)xx);
        vtxyear = unsigned( atoi( xx));
        EndDialog( dlg, 1);
    }
    return 0;
}
//=============================================================================



//=============================================================================
static unsigned dopoke( int really)
{
    //-------------------------------------------------------------------------
    for (unsigned char *ptr = snbuf;    *ptr;    )
    {
        //---------------------------------------------------------------------
        while ( *ptr == ' '     ||
                *ptr == ':'     ||
                *ptr == ';'     ||
                *ptr == ','
         )
        {
            ptr++;
        }
        //---------------------------------------------------------------------
        unsigned num = 0;
        //---------------------------------------------------------------------
        while (isdigit( *ptr))
            num = num * 10 + (*ptr++ - '0');
        //---------------------------------------------------------------------
        if (num < 0x4000 || num > 0xFFFF)
            return unsigned( ptr - snbuf + 1);
        //---------------------------------------------------------------------
        while ( *ptr == ' '     ||
                *ptr == ':'     ||
                *ptr == ';'     ||
                *ptr == ','
         )
        {
            ptr++;
        }
        //---------------------------------------------------------------------
        unsigned val = 0;
        //---------------------------------------------------------------------
        while (isdigit( *ptr))
            val = val * 10 + (*ptr++ - '0');
        //---------------------------------------------------------------------
        if (val > 0xFF)
            return unsigned( ptr - snbuf + 1);
        //---------------------------------------------------------------------
        while ( *ptr == ' '     ||
                *ptr == ':'     ||
                *ptr == ';'     ||
                *ptr == ','
         )
        {
            ptr++;
        }
        //---------------------------------------------------------------------
        if (really)
            cpu.DirectWm( num, u8( val));
        //---------------------------------------------------------------------
    }
    //-------------------------------------------------------------------------
   return 0;
}
//=============================================================================



//=============================================================================
// а чего оно делает в звуке?
INT_PTR CALLBACK pokedlg( HWND dlg, UINT msg, WPARAM wp, LPARAM lp)
{
    (void)lp;
    //-------------------------------------------------------------------------
    if (msg == WM_INITDIALOG)
    {
        SetFocus( GetDlgItem( dlg, IDE_POKE));
        return 1;
    }
    //-------------------------------------------------------------------------
    if ( (msg == WM_COMMAND && wp == IDCANCEL) ||
         (msg == WM_SYSCOMMAND && (wp & 0xFFF0) == SC_CLOSE)
     )
    {
        EndDialog( dlg, 0);
    }
    //-------------------------------------------------------------------------
    if (msg == WM_COMMAND && LOWORD(wp) == IDOK)
    {
        SendDlgItemMessage(     dlg,
                                IDE_POKE,
                                WM_GETTEXT,
                                /*sizeof snbuf*/ 640 * 480 * 4,
                                (LPARAM)snbuf
                        );                      //Alone Coder 0.36.5
        unsigned r = dopoke(0);
        //---------------------------------------------------------------------
        if (r)
        {
            MessageBox( dlg, "Incorrect format", nullptr, MB_ICONERROR);
            SendDlgItemMessage( dlg, IDE_POKE, EM_SETSEL, r, r);
        }
        //---------------------------------------------------------------------
        else
        {
            dopoke(1);
            EndDialog( dlg, 0);
        }
        //---------------------------------------------------------------------
    }
    return 0;
}
//=============================================================================