Subversion Repositories pentevo

Rev

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

  1. #include "std.h"
  2.  
  3. #include "resource.h"
  4.  
  5. #include "emul.h"
  6. #include "vars.h"
  7. #include "dx.h"
  8. #include "memory.h"
  9. #include "savesnd.h"
  10.  
  11. #include "util.h"
  12.  
  13. //=============================================================================
  14. static unsigned char wavhdr[]=
  15. {
  16.     0x52, 0x49, 0x46, 0x46, 0xCC, 0xF6, 0x3E, 0x00,
  17.     0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20,
  18.     0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00,
  19.     0x22, 0x56, 0x00, 0x00, 0x88, 0x58, 0x01, 0x00,
  20.     0x04, 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61,
  21.     0xA8, 0xF6, 0x3E, 0x00
  22. };
  23. //=============================================================================
  24. #pragma pack( push, 1)
  25. //=============================================================================
  26. static struct
  27. {
  28.     unsigned short sig;
  29.     unsigned char stereo;
  30.     unsigned short start;
  31.     unsigned ayfq;
  32.     unsigned char intfq;
  33.     unsigned short year;
  34.     unsigned rawsize;
  35. } vtxheader;
  36. //=============================================================================
  37. #pragma pack( pop)
  38. //=============================================================================
  39. static bool silence(unsigned pos)
  40. {
  41.     return !(vtxbuf[ pos+8] | vtxbuf[ pos+9] | vtxbuf[ pos+10]) ||
  42.             (vtxbuf[ pos+7] & 0x3F) == 0x3F;
  43. }
  44. //=============================================================================
  45. INT_PTR CALLBACK VtxDlg( HWND dlg, UINT msg, WPARAM wp, LPARAM lp);
  46. //=============================================================================
  47. static unsigned vtxyear;
  48. static unsigned vtxchip;
  49. static char vtxname[200];
  50. static char vtxauthor[200];
  51. static char vtxsoft[200];
  52. static char vtxtracker[200];
  53. static char vtxcomm[200];
  54. //=============================================================================
  55.  
  56.  
  57.  
  58. //=============================================================================
  59. void savesnddialog()
  60. {
  61.     OnEnterGui();       //Alone Coder
  62.     unsigned end;       //Alone Coder 0.36.7
  63.    
  64.     //-------------------------------------------------------------------------
  65.     if (savesndtype)
  66.     {
  67.         //---------------------------------------------------------------------
  68.         // wave
  69.         if (savesndtype == 1)
  70.         {
  71.             unsigned fsize = unsigned( ftell( savesnd));
  72.             fseek( savesnd, 0, SEEK_SET);
  73.             fsize -= sizeof wavhdr;
  74.             *(unsigned*)(wavhdr + 4) = fsize + 0x2c - 8;
  75.             *(unsigned*)(wavhdr + 0x28) = fsize;
  76.             fwrite( wavhdr, 1, sizeof wavhdr, savesnd);
  77.             MessageBox( wnd, "WAV save done", "Save sound", MB_ICONINFORMATION);
  78.         }
  79.         //---------------------------------------------------------------------
  80.         // vtx
  81.         else
  82.         {
  83.             savesndtype = 0;
  84.             unsigned char *newb = (unsigned char*)malloc( vtxbuffilled);
  85.             //-----------------------------------------------------------------
  86.             for (/*unsigned*/ end = 0;    end < vtxbuffilled && silence( end);    end += 14);
  87.             //-----------------------------------------------------------------
  88.             vtxbuffilled -= end;
  89.             memcpy( vtxbuf, vtxbuf + end, vtxbuffilled);
  90.             //-----------------------------------------------------------------
  91.             for (end = vtxbuffilled;    end && silence( end - 14);    end -= 14);
  92.             //-----------------------------------------------------------------
  93.             vtxbuffilled = end;
  94.             int nrec = vtxbuffilled / 14;
  95.             //-----------------------------------------------------------------
  96.             for (int i = 0;    i < nrec;    i++)
  97.             {
  98.                 //-------------------------------------------------------------
  99.                 for (int j = 0;    j < 14;    j++)
  100.                 {
  101.                     newb[ j * nrec + i] = vtxbuf[ i * 14 + j];
  102.                 }
  103.                 //-------------------------------------------------------------
  104.             }
  105.             //-----------------------------------------------------------------
  106.             free( vtxbuf);
  107.             FILE *ff = fopen( "vtx.tmp", "wb");
  108.             //-----------------------------------------------------------------
  109.             if (!ff)
  110.                 goto save_sound_exit;
  111.                 //return;
  112.             //-----------------------------------------------------------------
  113.             fwrite( newb, 1, vtxbuffilled, ff);
  114.             fclose( ff);
  115.             STARTUPINFO si = { sizeof si };
  116.             si.dwFlags = STARTF_USESHOWWINDOW;
  117.             si.wShowWindow = SW_HIDE;
  118.             PROCESS_INFORMATION pi;
  119.             char Parh[] = "lha a vtx.lzh vtx.tmp";
  120.             //-----------------------------------------------------------------
  121.             if ( CreateProcess(         nullptr,
  122.                                         Parh,
  123.                                         nullptr,
  124.                                         nullptr,
  125.                                         0,
  126.                                         0,
  127.                                         nullptr,
  128.                                         nullptr,
  129.                                         &si,
  130.                                         &pi
  131.                                 )
  132.              )
  133.             {
  134.                 WaitForSingleObject( pi.hProcess, 5000);
  135.                 CloseHandle( pi.hProcess);
  136.                 CloseHandle( pi.hThread);
  137.                 DeleteFile( "vtx.tmp");
  138.             }
  139.             //-----------------------------------------------------------------
  140.             else
  141.             {
  142.                 DeleteFile( "vtx.tmp");
  143.                 MessageBox(     wnd,
  144.                                 "LHA.EXE not found in %PATH%",
  145.                                 nullptr,
  146.                                 MB_ICONERROR
  147.                         );
  148.                 goto save_sound_exit;
  149.                 //return;
  150.             }
  151.             //-----------------------------------------------------------------
  152.             ff = fopen( "vtx.lzh", "rb");
  153.             //-----------------------------------------------------------------
  154.             if (!ff)
  155.                 goto save_sound_exit;
  156.                 //return;
  157.             //-----------------------------------------------------------------v
  158.             fseek( ff, 0x22, SEEK_SET);
  159.             size_t packed = fread( newb, 1, vtxbuffilled, ff) - 1;
  160.             fclose( ff);
  161.             DeleteFile( "vtx.lzh");
  162.             DialogBox( hIn, MAKEINTRESOURCE( IDD_VTX), wnd, VtxDlg);
  163.             vtxheader.sig = (vtxchip & 1)  ?  WORD2( 'y','m') :
  164.                                               WORD2( 'a','y');
  165.             static unsigned char ste[] = { 1, 2, 0 };
  166.             vtxheader.stereo = ste[ vtxchip / 2];
  167.             vtxheader.ayfq = conf.sound.ayfq;
  168.             vtxheader.intfq = 50;       // хотя для совместимости
  169.                                         // наверно стоит оставить 50       
  170.             vtxheader.year = u16( vtxyear);
  171.             vtxheader.rawsize = vtxbuffilled;
  172.             fwrite( &vtxheader, 1, 0x10,                        savesnd);
  173.             fwrite( vtxname,    1, strlen( vtxname) + 1,        savesnd);
  174.             fwrite( vtxauthor,  1, strlen( vtxauthor) + 1,      savesnd);
  175.             fwrite( vtxsoft,    1, strlen( vtxsoft) + 1,        savesnd);
  176.             fwrite( vtxtracker, 1, strlen( vtxtracker) + 1,     savesnd);
  177.             fwrite( vtxcomm,    1, strlen( vtxcomm) + 1,        savesnd);
  178.             fwrite( newb,       1, packed,                      savesnd);
  179.         }
  180.         //---------------------------------------------------------------------
  181.         fclose( savesnd);
  182.         savesndtype = 0;
  183.     }
  184.     //-------------------------------------------------------------------------
  185.     else
  186.     {
  187.         OPENFILENAME ofn = { };
  188.         char sndsavename[0x200];
  189.         *sndsavename = 0;
  190.  
  191.         ofn.lStructSize = (WinVerMajor < 5)  ?  OPENFILENAME_SIZE_VERSION_400 :
  192.                                                 sizeof( OPENFILENAME);
  193.         ofn.lpstrFilter = "All sound (WAV)\0*.wav\0AY sound (VTX)\0*.vtx\0";
  194.         ofn.lpstrFile = sndsavename;
  195.         ofn.nMaxFile = sizeof sndsavename;
  196.         ofn.lpstrTitle = "Save Sound";
  197.         ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
  198.         ofn.hwndOwner = wnd;
  199.         ofn.nFilterIndex = 1;
  200.         //---------------------------------------------------------------------
  201.         if (GetSaveFileName( &ofn))
  202.         {
  203.             char *name = sndsavename;
  204.             //-----------------------------------------------------------------
  205.             for (char *x = name;    *x;    x++)
  206.                 if (*x == '\\')
  207.                     name = x + 1;
  208.             //-----------------------------------------------------------------
  209.             if (!strchr( name, '.'))
  210.             {
  211.                 //-------------------------------------------------------------
  212.                 if (ofn.nFilterIndex == 1)
  213.                 {
  214.                     strcat( sndsavename, ".wav");
  215.                 }
  216.                 //-------------------------------------------------------------
  217.                 else
  218.                 {
  219.                     strcat( sndsavename, ".vtx");
  220.                 }
  221.                 //-------------------------------------------------------------
  222.             }
  223.             //-----------------------------------------------------------------
  224.             savesnd = fopen( ofn.lpstrFile, "wb");
  225.             //-----------------------------------------------------------------
  226.             if (!savesnd)
  227.             {
  228.                 MessageBox( wnd, "Can't create file", nullptr, MB_ICONERROR);
  229.             }
  230.             //-----------------------------------------------------------------
  231.             // vtx
  232.             else if (ofn.nFilterIndex == 2)
  233.             {
  234.                 savesndtype = 2;
  235.                 vtxbuf = nullptr;
  236.             }
  237.             //-----------------------------------------------------------------
  238.             // wave. all params, except fq are fixed: 16bit,stereo
  239.             else
  240.             {
  241.                 *(unsigned*)(wavhdr + 0x18) = conf.sound.fq;            // fq
  242.                 *(unsigned*)(wavhdr + 0x1C) = conf.sound.fq * 4;        // bitrate
  243.                 fwrite( wavhdr, 1, 44, savesnd);                        // header
  244.                 savesndtype = 1;
  245.             }
  246.             //-----------------------------------------------------------------
  247.         }
  248.         //---------------------------------------------------------------------
  249.     }
  250.     //-------------------------------------------------------------------------
  251.  
  252. save_sound_exit:
  253.  
  254. /*
  255.     // вынесено в WM_INITMENU
  256.     //-------------------------------------------------------------------------
  257.     HMENU main_menu = GetMenu( wnd);
  258.     //-------------------------------------------------------------------------
  259.     if (main_menu)
  260.     {
  261.         //---------------------------------------------------------------------
  262.         // запись пошла и ее можно остановить
  263.         if (savesndtype)
  264.         {
  265.             ModifyMenu(     main_menu,
  266.                             IDM_AUDIOREC,
  267.                             MF_BYCOMMAND | MF_STRING,
  268.                             IDM_AUDIOREC,
  269.                             "Stop Audio Recording"
  270.                         );
  271.         }
  272.         //---------------------------------------------------------------------
  273.         // запись можно начать
  274.         else
  275.         {
  276.             ModifyMenu(     main_menu,
  277.                             IDM_AUDIOREC,
  278.                             MF_BYCOMMAND | MF_STRING,
  279.                             IDM_AUDIOREC,
  280.                             "Start Audio Recording"
  281.                         );
  282.         }
  283.         //---------------------------------------------------------------------
  284.     }
  285. */
  286.     //-------------------------------------------------------------------------
  287.     eat();
  288.     OnExitGui();        //Alone Coder
  289. }
  290. //=============================================================================
  291.  
  292.  
  293.  
  294. //=============================================================================
  295. INT_PTR CALLBACK VtxDlg(HWND dlg, UINT msg, WPARAM wp, LPARAM lp)
  296. {
  297.     (void)lp;
  298.     //-------------------------------------------------------------------------
  299.     if (msg == WM_INITDIALOG)
  300.     {
  301.         static char chips[] = "ABC AY\0ABC YM\0ACB AY\0ACB YM\0MONO AY\0MONO YM\0";
  302.         //-------------------------------------------------------------------------
  303.         for (char *str = chips;    *str;    str += strlen( str) + 1)
  304.             SendDlgItemMessage(     dlg,
  305.                                     IDC_VTXCHIP,
  306.                                     CB_ADDSTRING,
  307.                                     0,
  308.                                     (LPARAM)str
  309.                                 );
  310.         //-------------------------------------------------------------------------
  311.         unsigned c = ((conf.sound.ay_voltab[8] == conf.sound.ay_voltab[9])  ?  0:
  312.                                                                                1);
  313.         // убрано из конца unsigned c
  314.         //               + (conf.ay_preset > 2  ?  0:
  315.         //                                           conf.ay_preset * 2)
  316.         //                     
  317.         SendDlgItemMessage(     dlg,
  318.                                 IDC_VTXCHIP,
  319.                                 CB_SETCURSEL,
  320.                                 c,
  321.                                 0
  322.                         );
  323.         SetFocus(       GetDlgItem( dlg, IDE_VTXNAME));
  324.         return 1;
  325.     }
  326.     //-------------------------------------------------------------------------
  327.     if (  ((msg == WM_SYSCOMMAND) && ((wp & 0xFFF0) == SC_CLOSE))       ||
  328.           ((msg == WM_COMMAND) && (LOWORD( wp) == IDOK))
  329.      )
  330.     {
  331.         SendDlgItemMessage( dlg, IDE_VTXNAME,  WM_GETTEXT, sizeof vtxname,    (LPARAM)vtxname);
  332.         SendDlgItemMessage( dlg, IDE_VTXAUTH,  WM_GETTEXT, sizeof vtxauthor,  (LPARAM)vtxauthor);
  333.         SendDlgItemMessage( dlg, IDE_VTXSOFT,  WM_GETTEXT, sizeof vtxsoft,    (LPARAM)vtxsoft);
  334.         SendDlgItemMessage( dlg, IDE_VTXTRACK, WM_GETTEXT, sizeof vtxtracker, (LPARAM)vtxtracker);
  335.         SendDlgItemMessage( dlg, IDE_VTXCOMM,  WM_GETTEXT, sizeof vtxcomm,    (LPARAM)vtxcomm);
  336.         vtxchip = unsigned( SendDlgItemMessage( dlg, IDC_VTXCHIP, CB_GETCURSEL, 0, 0));
  337.         char xx[20];
  338.         SendDlgItemMessage( dlg, IDE_VTXYEAR,  WM_GETTEXT, sizeof xx,         (LPARAM)xx);
  339.         vtxyear = unsigned( atoi( xx));
  340.         EndDialog( dlg, 1);
  341.     }
  342.     return 0;
  343. }
  344. //=============================================================================
  345.  
  346.  
  347.  
  348. //=============================================================================
  349. static unsigned dopoke( int really)
  350. {
  351.     //-------------------------------------------------------------------------
  352.     for (unsigned char *ptr = snbuf;    *ptr;    )
  353.     {
  354.         //---------------------------------------------------------------------
  355.         while ( *ptr == ' '     ||
  356.                 *ptr == ':'     ||
  357.                 *ptr == ';'     ||
  358.                 *ptr == ','
  359.          )
  360.         {
  361.             ptr++;
  362.         }
  363.         //---------------------------------------------------------------------
  364.         unsigned num = 0;
  365.         //---------------------------------------------------------------------
  366.         while (isdigit( *ptr))
  367.             num = num * 10 + (*ptr++ - '0');
  368.         //---------------------------------------------------------------------
  369.         if (num < 0x4000 || num > 0xFFFF)
  370.             return unsigned( ptr - snbuf + 1);
  371.         //---------------------------------------------------------------------
  372.         while ( *ptr == ' '     ||
  373.                 *ptr == ':'     ||
  374.                 *ptr == ';'     ||
  375.                 *ptr == ','
  376.          )
  377.         {
  378.             ptr++;
  379.         }
  380.         //---------------------------------------------------------------------
  381.         unsigned val = 0;
  382.         //---------------------------------------------------------------------
  383.         while (isdigit( *ptr))
  384.             val = val * 10 + (*ptr++ - '0');
  385.         //---------------------------------------------------------------------
  386.         if (val > 0xFF)
  387.             return unsigned( ptr - snbuf + 1);
  388.         //---------------------------------------------------------------------
  389.         while ( *ptr == ' '     ||
  390.                 *ptr == ':'     ||
  391.                 *ptr == ';'     ||
  392.                 *ptr == ','
  393.          )
  394.         {
  395.             ptr++;
  396.         }
  397.         //---------------------------------------------------------------------
  398.         if (really)
  399.             cpu.DirectWm( num, u8( val));
  400.         //---------------------------------------------------------------------
  401.     }
  402.     //-------------------------------------------------------------------------
  403.    return 0;
  404. }
  405. //=============================================================================
  406.  
  407.  
  408.  
  409. //=============================================================================
  410. // а чего оно делает в звуке?
  411. INT_PTR CALLBACK pokedlg( HWND dlg, UINT msg, WPARAM wp, LPARAM lp)
  412. {
  413.     (void)lp;
  414.     //-------------------------------------------------------------------------
  415.     if (msg == WM_INITDIALOG)
  416.     {
  417.         SetFocus( GetDlgItem( dlg, IDE_POKE));
  418.         return 1;
  419.     }
  420.     //-------------------------------------------------------------------------
  421.     if ( (msg == WM_COMMAND && wp == IDCANCEL) ||
  422.          (msg == WM_SYSCOMMAND && (wp & 0xFFF0) == SC_CLOSE)
  423.      )
  424.     {
  425.         EndDialog( dlg, 0);
  426.     }
  427.     //-------------------------------------------------------------------------
  428.     if (msg == WM_COMMAND && LOWORD(wp) == IDOK)
  429.     {
  430.         SendDlgItemMessage(     dlg,
  431.                                 IDE_POKE,
  432.                                 WM_GETTEXT,
  433.                                 /*sizeof snbuf*/ 640 * 480 * 4,
  434.                                 (LPARAM)snbuf
  435.                         );                      //Alone Coder 0.36.5
  436.         unsigned r = dopoke(0);
  437.         //---------------------------------------------------------------------
  438.         if (r)
  439.         {
  440.             MessageBox( dlg, "Incorrect format", nullptr, MB_ICONERROR);
  441.             SendDlgItemMessage( dlg, IDE_POKE, EM_SETSEL, r, r);
  442.         }
  443.         //---------------------------------------------------------------------
  444.         else
  445.         {
  446.             dopoke(1);
  447.             EndDialog( dlg, 0);
  448.         }
  449.         //---------------------------------------------------------------------
  450.     }
  451.     return 0;
  452. }
  453. //=============================================================================
  454.  
  455.