home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2002 December (Special) / DOSV2002_12.iso / utility / tcl230ja95.lzh / source.lzh / exe / alarm.c next >
C/C++ Source or Header  |  2001-02-04  |  11KB  |  467 lines

  1. /*-------------------------------------------
  2.   alarm.c
  3.     Sound a wave, a media file, or open a file
  4.     KAZUBON 1997-1999
  5. ---------------------------------------------*/
  6.  
  7. #include "tclock.h"
  8.  
  9. static PALARMSTRUCT pAS = NULL;
  10. static int maxAlarm = 1;
  11. static BOOL bJihou, bJihouRepeat, bJihouBlink;
  12. static int daySaved = -1;
  13. static int hourLast = -1, minuteLast = -1;
  14.  
  15. static WAVEFORMATEX *pFormat = NULL;
  16. static HWAVEOUT hWaveOut = NULL;
  17. static HPSTR pData = NULL;
  18. static WAVEHDR wh;
  19.  
  20. static BOOL bMCIPlaying = FALSE;
  21. static int countPlay = 0, countPlayNum = 0;
  22. static int nTrack;
  23. static BOOL bTrack;
  24. BOOL bPlayingNonstop = FALSE;
  25.  
  26. BOOL PlayWave(HWND hwnd, char *fname, DWORD dwLoops);
  27. int PlayMCI(HWND hwnd, int nt);
  28. void StopWave(void);
  29.  
  30. /*------------------------------------------------
  31.  アラーム/時報の初期化
  32. --------------------------------------------------*/
  33. void InitAlarm(void)
  34. {
  35.     char subkey[20];
  36.     int i;
  37.  
  38.     maxAlarm = GetMyRegLong("", "AlarmNum", 0);
  39.     if(maxAlarm < 1) maxAlarm = 0;
  40.     if(pAS) free(pAS); pAS = NULL;
  41.     if(maxAlarm > 0)
  42.     {
  43.         pAS = malloc(sizeof(ALARMSTRUCT) * maxAlarm);
  44.         for(i = 0; i < maxAlarm; i++)
  45.         {
  46.             wsprintf(subkey, "Alarm%d", i + 1);
  47.             
  48.             GetMyRegStr(subkey, "Name", pAS[i].name, 40, "");
  49.             pAS[i].bAlarm = GetMyRegLong(subkey, "Alarm", FALSE);
  50.             pAS[i].hour = GetMyRegLong(subkey, "Hour", 12);
  51.             pAS[i].minute = GetMyRegLong(subkey, "Minute", 0);
  52.             GetMyRegStr(subkey, "File", pAS[i].fname, 1024, "");
  53.             pAS[i].bHour12 = GetMyRegLong(subkey, "Hour12", TRUE);
  54.             pAS[i].bRepeat = GetMyRegLong(subkey, "Repeat", FALSE);
  55.             pAS[i].bBlink = GetMyRegLong(subkey, "Blink", FALSE);
  56.             pAS[i].days = GetMyRegLong(subkey, "Days", 0x7f);
  57.         }
  58.     }
  59.     
  60.     bJihou = GetMyRegLong("", "Jihou", FALSE);
  61.     if(bJihou)
  62.     {
  63.         bJihouRepeat = GetMyRegLong("", "JihouRepeat", FALSE);
  64.         bJihouBlink = GetMyRegLong("", "JihouBlink", FALSE);
  65.     }
  66. }
  67.  
  68. void EndAlarm(void)
  69. {
  70.     if(pAS) free(pAS); pAS = NULL;
  71.     StopFile();
  72. }
  73.  
  74. /*------------------------------------------------
  75.  アラーム/時報を鳴らす
  76. --------------------------------------------------*/
  77. void CheckAlarm(HWND hwnd, SYSTEMTIME* st)
  78. {
  79.     int i, rep, h, fday;
  80.     
  81.     if(hourLast == (int)st->wHour &&
  82.         minuteLast == (int)st->wMinute)
  83.     {
  84.         return;
  85.     }
  86.     hourLast = st->wHour;
  87.     minuteLast = st->wMinute;
  88.     
  89.     if(daySaved >= 0 && st->wDay != daySaved)
  90.     {
  91.         if(ExecDeskcal(hwnd)) daySaved = st->wDay;
  92.     }
  93.     else daySaved = st->wDay;
  94.     
  95.     if(st->wDayOfWeek > 0)
  96.         fday = 1 << (st->wDayOfWeek - 1);
  97.     else fday = 1 << 6;
  98.     
  99.     for(i = 0; i < maxAlarm; i++)
  100.     {
  101.         if(!pAS[i].bAlarm) continue;
  102.         h = st->wHour;
  103.         if(pAS[i].bHour12)
  104.         {
  105.             if(h == 0) h = 12;
  106.             else if(h >= 13) h -= 12;
  107.         }
  108.         
  109.         if(pAS[i].hour == h && pAS[i].minute == st->wMinute
  110.             && (pAS[i].days & fday))
  111.         {
  112.             if(pAS[i].bBlink)
  113.                 PostMessage(g_hwndClock, CLOCKM_BLINK, FALSE, 0);
  114.             
  115.             if(pAS[i].fname[0])
  116.             {
  117.                 if(pAS[i].bRepeat) rep = -1; else rep = 0;
  118.                 if(PlayFile(hwnd, pAS[i].fname, rep)) return;
  119.             }
  120.         }
  121.     }
  122.  
  123.     if(bJihou && st->wMinute == 0)
  124.     {
  125.         char fname[1024];
  126.         h = st->wHour;
  127.         if(bJihouBlink)
  128.             PostMessage(g_hwndClock, CLOCKM_BLINK, TRUE, 0);
  129.         if(h == 0) h = 12;
  130.         else if(h >= 13) h -= 12;
  131.         GetMyRegStr("", "JihouFile", fname, 1024, "");
  132.         if(fname[0])
  133.         {
  134.             if(bJihouRepeat) rep = h; else rep = 0;
  135.             PlayFile(hwnd, fname, rep);
  136.         }
  137.     }
  138. }
  139.  
  140. /*------------------------------------------------
  141.  ファイルの再生/実行   dwLoops:繰り返し回数
  142. --------------------------------------------------*/
  143. BOOL PlayFile(HWND hwnd, char *fname, DWORD dwLoops)
  144. {
  145.     BOOL b;
  146.     b = GetMyRegLong("", "MCIWave", FALSE);
  147.     
  148.     if(*fname == 0) return FALSE;
  149.     
  150.     if(!b && ext_cmp(fname, "wav") == 0)
  151.     {
  152.         if(bMCIPlaying) return FALSE;
  153.         return PlayWave(hwnd, fname, dwLoops);
  154.     }
  155.     else if(IsMMFile(fname))
  156.     {
  157.         char command[1024];
  158.         if(bMCIPlaying) return FALSE;
  159.         strcpy(command, "open \"");
  160.         strcat(command, fname);
  161.         strcat(command, "\" alias myfile");
  162.         if(mciSendString(command, NULL, 0, NULL) == 0)
  163.         {
  164.             strcpy(command, "set myfile time format ");
  165.             if(_stricmp(fname, "cdaudio") == 0 || ext_cmp(fname, "cda") == 0)
  166.             {
  167.                 strcat(command, "tmsf"); bTrack = TRUE;
  168.             }
  169.             else
  170.             {
  171.                 strcat(command, "milliseconds"); bTrack = FALSE;
  172.             }
  173.             mciSendString(command, NULL, 0, NULL);
  174.             
  175.             nTrack = -1;
  176.             if(ext_cmp(fname, "cda") == 0)
  177.             {
  178.                 char* p;
  179.                 p = fname; nTrack = 0;
  180.                 while(*p)
  181.                 {
  182.                     if('0' <= *p && *p <= '9') nTrack = nTrack * 10 + *p - '0';
  183.                     p++;
  184.                 }
  185.             }
  186.             if(PlayMCI(hwnd, nTrack) == 0)
  187.             {
  188.                 bMCIPlaying = TRUE;
  189.                 countPlay = 1; countPlayNum = dwLoops;
  190.             }
  191.             else mciSendString("close myfile", NULL, 0, NULL);
  192.         }
  193.         return bMCIPlaying;
  194.     }
  195.     else ExecFile(hwnd, fname);
  196.     return FALSE;
  197. }
  198.  
  199. int PlayMCI(HWND hwnd, int nt)
  200. {
  201.     char command[80], s[80];
  202.     char start[40], end[40];
  203.     
  204.     strcpy(command, "play myfile");
  205.     if(nt >= 0)
  206.     {
  207.         wsprintf(s, "status myfile position track %d", nt);
  208.         if(mciSendString(s, start, 40, NULL) == 0)
  209.         {
  210.             strcat(command, " from ");
  211.             strcat(command, start);
  212.             wsprintf(s, "status myfile position track %d", nt+1);
  213.             if(mciSendString(s, end, 40, NULL) == 0)
  214.             {
  215.                 strcat(command, " to ");
  216.                 strcat(command, end);
  217.             }
  218.         }
  219.     }
  220.     strcat(command, " notify");
  221.     return mciSendString(command, NULL, 0, hwnd);
  222. }
  223.  
  224. /*------------------------------------------------
  225.  再生停止
  226. --------------------------------------------------*/
  227. void StopFile(void)
  228. {
  229.     StopWave();
  230.     if(bMCIPlaying)
  231.     {
  232.         mciSendString("stop myfile", NULL, 0, NULL);
  233.         mciSendString("close myfile", NULL, 0, NULL);
  234.         bMCIPlaying = FALSE;
  235.         countPlay = 0; countPlayNum = 0;
  236.     }
  237.     bPlayingNonstop = FALSE;
  238. }
  239.  
  240. void OnMCINotify(HWND hwnd)
  241. {
  242.     if(bMCIPlaying)
  243.     {
  244.         if(countPlay < countPlayNum || countPlayNum < 0)
  245.         {
  246.             mciSendString("seek myfile to start wait", NULL, 0, NULL);
  247.             if(PlayMCI(hwnd, nTrack) == 0)
  248.             {
  249.                 countPlay++;
  250.             }
  251.             else
  252.                 StopFile();
  253.         }
  254.         else StopFile();
  255.     }
  256. }
  257.  
  258. /*--------------------------------------------------------
  259.   Retreive a file name and option from a command string
  260. ----------------------------------------------------------*/
  261. void GetFileAndOption(const char* command, char* fname, char* opt)
  262. {
  263.     const char *p, *pe;
  264.     char *pd;
  265.     WIN32_FIND_DATA fd;
  266.     HANDLE hfind;
  267.     
  268.     p = command; pd = fname;
  269.     pe = NULL;
  270.     for(; ;)
  271.     {
  272.         if(*p == ' ' || *p == 0)
  273.         {
  274.             *pd = 0;
  275.             hfind = FindFirstFile(fname, &fd);
  276.             if(hfind != INVALID_HANDLE_VALUE)
  277.             {
  278.                 FindClose(hfind);
  279.                 pe = p;
  280.             }
  281.             if(*p == 0) break;
  282.         }
  283.         *pd++ = *p++;
  284.     }
  285.     if(pe == NULL) pe = p;
  286.     
  287.     p = command; pd = fname;
  288.     for(; p != pe; )
  289.     {
  290.         *pd++ = *p++;
  291.     }
  292.     *pd = 0;
  293.     if(*p == ' ') p++;
  294.     
  295.     pd = opt;
  296.     for(; *p; ) *pd++ = *p++;
  297.     *pd = 0;
  298. }
  299.  
  300. /*------------------------------------------------
  301.   Open a file
  302. --------------------------------------------------*/
  303. BOOL ExecFile(HWND hwnd, char* command)
  304. {
  305.     char fname[MAX_PATH], opt[MAX_PATH];
  306.     
  307.     if(*command == 0) return FALSE;
  308.     
  309.     GetFileAndOption(command, fname, opt);
  310.     
  311.     if((int)ShellExecute(hwnd, NULL, fname,
  312.         opt[0]?opt:NULL, "", SW_SHOW) < 32) return FALSE;
  313.     return TRUE;
  314. }
  315.  
  316. /*------------------------------------------------
  317.  WAVEの再生   dwLoops:繰り返し回数
  318.  参考:Visual C++ 1.x のサンプルREVERSE
  319. --------------------------------------------------*/
  320. BOOL PlayWave(HWND hwnd, char *fname, DWORD dwLoops)
  321. {
  322.     HMMIO hmmio;
  323.     MMCKINFO mmckinfoParent;
  324.     MMCKINFO mmckinfoSubchunk;
  325.     LONG lFmtSize;
  326.     LONG lDataSize;
  327.     
  328.     if(hWaveOut != NULL) return FALSE;
  329.     
  330.     if(!(hmmio = mmioOpen(fname, NULL, MMIO_READ | MMIO_ALLOCBUF)))
  331.         return FALSE;
  332.     
  333.     mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E');
  334.     if(mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, MMIO_FINDRIFF))
  335.     {
  336.         mmioClose(hmmio, 0);
  337.         return FALSE;
  338.     }
  339.  
  340.     mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' ');
  341.     if(mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
  342.         MMIO_FINDCHUNK))
  343.     {
  344.         mmioClose(hmmio, 0);
  345.         return FALSE;
  346.     }
  347.     
  348.     lFmtSize = mmckinfoSubchunk.cksize;
  349.     pFormat = (WAVEFORMATEX*)malloc(lFmtSize);
  350.     if(pFormat == NULL)
  351.     {
  352.         mmioClose(hmmio, 0);
  353.         return FALSE;
  354.     }
  355.     
  356.     if(mmioRead(hmmio, (HPSTR)pFormat, lFmtSize) != lFmtSize)
  357.     {
  358.         free(pFormat); pFormat = NULL;
  359.         mmioClose(hmmio, 0);
  360.         return FALSE;
  361.     }
  362.     
  363.     /*
  364.     if(pFormat->wFormatTag != WAVE_FORMAT_PCM)
  365.     {
  366.         free(pFormat); pFormat = NULL;
  367.         mmioClose(hmmio, 0);
  368.         return FALSE;
  369.     }
  370.     */
  371.  
  372.     if(waveOutOpen(&hWaveOut, (UINT)WAVE_MAPPER, (LPWAVEFORMATEX)pFormat,
  373.         0, 0, (DWORD)WAVE_FORMAT_QUERY))
  374.     {
  375.         free(pFormat); pFormat = NULL;
  376.         mmioClose(hmmio, 0);
  377.         return FALSE;
  378.     }
  379.     
  380.     mmioAscend(hmmio, &mmckinfoSubchunk, 0);
  381.     
  382.     mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a');
  383.     if(mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
  384.         MMIO_FINDCHUNK))
  385.     {
  386.         free(pFormat); pFormat = NULL;
  387.         mmioClose(hmmio, 0);
  388.         return FALSE;
  389.     }
  390.  
  391.     lDataSize = mmckinfoSubchunk.cksize;
  392.     if(lDataSize == 0)
  393.     {
  394.         free(pFormat); pFormat = NULL;
  395.         mmioClose(hmmio, 0);
  396.         return FALSE;
  397.     }
  398.     
  399.     pData = (HPSTR)malloc(lDataSize);
  400.     if(pData == NULL)
  401.     {
  402.         free(pFormat); pFormat = NULL;
  403.         mmioClose(hmmio, 0);
  404.         return FALSE;
  405.     }
  406.     
  407.     if(mmioRead(hmmio, pData, lDataSize) != lDataSize)
  408.     {
  409.         free(pFormat); pFormat = NULL;
  410.         free(pData); pData = NULL;
  411.         mmioClose(hmmio, 0);
  412.         return FALSE;
  413.     }
  414.     mmioClose(hmmio, 0);
  415.     
  416.     if(waveOutOpen((LPHWAVEOUT)&hWaveOut, (UINT)WAVE_MAPPER,
  417.         (LPWAVEFORMATEX)pFormat, (UINT)hwnd, 0,
  418.         (DWORD)CALLBACK_WINDOW))
  419.     {
  420.         free(pFormat); pFormat = NULL;
  421.         free(pData); pData = NULL;
  422.         return FALSE;
  423.     }
  424.     
  425.     memset(&wh, 0, sizeof(WAVEHDR));
  426.     wh.lpData = pData;
  427.     wh.dwBufferLength = lDataSize;
  428.     if(dwLoops != 0)
  429.     {
  430.         wh.dwFlags = WHDR_BEGINLOOP|WHDR_ENDLOOP;
  431.         wh.dwLoops = dwLoops;
  432.     }
  433.     if(waveOutPrepareHeader(hWaveOut, &wh, sizeof(WAVEHDR)))
  434.     {
  435.         waveOutClose(hWaveOut); hWaveOut = NULL;
  436.         free(pFormat); pFormat = NULL;
  437.         free(pData); pData = NULL;
  438.         return FALSE;
  439.     }
  440.     
  441.     if(waveOutWrite(hWaveOut, &wh, sizeof(WAVEHDR)) != 0)
  442.     {
  443.         waveOutUnprepareHeader(hWaveOut, &wh, sizeof(WAVEHDR));
  444.         waveOutClose(hWaveOut);    hWaveOut = NULL;
  445.         free(pFormat); pFormat = NULL;
  446.         free(pData); pData = NULL;
  447.         return FALSE;
  448.     }
  449.  
  450.     return TRUE;
  451. }
  452.  
  453. /*------------------------------------------------
  454.  WAVE再生停止
  455. --------------------------------------------------*/
  456. void StopWave(void)
  457. {
  458.     if(hWaveOut == NULL) return;
  459.  
  460.     waveOutReset(hWaveOut);
  461.     waveOutUnprepareHeader(hWaveOut, &wh, sizeof(WAVEHDR));
  462.     waveOutClose(hWaveOut);        
  463.     hWaveOut = NULL;
  464.     free(pFormat); pFormat = NULL;
  465.     free(pData); pData = NULL;
  466. }
  467.