На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование звука"
0) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с записью, обработкой, воспроизведением звука. Перед созданием темы подумайте, не будет ли она уместнее в разделах Разработка и тестирование программ, Наши исходники, а особенно Разовые заказы и подработки
1) На Раздел распространяются все Правила форума.Огромная просьба с ними внимательно ознакомиться.
2) Запрещается давать бессмысленные ответы вроде: "Снеси Мастдай", "ХП рулит", "Поставь Линукс" и т.д.
3) Запрещается создавать темы, в которых Вы намереваетесь получить ссылку на кряки, серийники и т.п. Также запрещено любое обсуждение p2p (peer-to-peer) сетей (BitTorrent, eDonkey и т.д.).
4) Реклама всякого рода пресекается беспощадно.
5) Используйте тэг [CODE] для выделения кода программы (непременно с указанием языка программирования - выбрать из списка. В противном случае бессмысленно!). Уважайте тех, кто будет читать ваш код!
6) Если решение вашей проблемы найдено, то не забываем помечать тему специальной функцией "Вопрос решён". Вам всего лишь требуется при написании последнего ответа поставить одну единственную галочку прямо над формой ответа.
7) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе

8) Если не прикрепляются/не скачиваются файлы, читаем Не прикрепляется / не скачивается файл. Любые обсуждения в данном разделе проблем с приложением файлов считаются оффтопиком! Со всеми вытекающими.

9) NEW! Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно. Попытки накрутки количества тематических сообщений за счёт поднятия древних неактуальных тем ("некрофилия") будут наказываться по велению левой пятки модераторского состава (см. пп.12, 13 Правил)



Нарушение Правил может повлечь наказание со стороны модераторов.



user posted imageFAQ Раздела user posted imageПоиск в Разделе user posted imageMSDN Library Online | Ваше мнение о модераторах: user posted imageBarazuk user posted imageRikkie
  
> Проигрыватель.
    Прога проигрывает WAV файлы, все в принципе устраивает, кроме того, что
    ExpandedWrap disabled
      #include <iostream.h>
      #include <windows.h>
      #include <mmsystem.h>
      #include <stdio.h>
       
      #define BLOCK_SIZE 1024*4
      #define BLOCK_COUNT 6
       
      WAVEHDR* waveBlocks;
      int waveFreeBlockCount;
      int waveCurrentBlock;
       
      void CALLBACK waveOutProc(HWAVEOUT hWaveOut,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2){
       
            int *freeBlockCounter = (int*)dwInstance;
       
            if(uMsg!=WOM_DONE) return;
            (*freeBlockCounter)++;
            return;
      }
       
      WAVEHDR* allocateBlocks(int size,int count){
            char* buffer;
            int i;
            WAVEHDR* blocks;
            DWORD totalBufferSize = size*count;
       
            if((buffer = (unsigned char*) HeapAlloc(GetProcessHeap(),
            HEAP_ZERO_MEMORY, totalBufferSize)) == NULL)
            {
                  printf("Ошибка при выделение памяти\n");
                  getchar();
                  ExitProcess(1);
            }
       
            blocks = (WAVEHDR*)buffer;
            buffer += sizeof(WAVEHDR)*count;
            for(i=0; i < count; i++)
            {
                  blocks[i].dwBufferLength = size;
                  blocks[i].lpData = buffer;
                  buffer += size;
            }
            return blocks;
      }
      void freeBlocks(WAVEHDR* blockArray){
            HeapFree(GetProcessHeap(),0,blockArray);
            return;
      }
      void writeAudio(HWAVEOUT hWaveOut,char *data,int size){
            WAVEHDR* current;
            int remain;
            current = &waveBlocks[waveCurrentBlock];
            while(size>0){
                  if(size < (int)(BLOCK_SIZE - current->dwUser)){
       
                        memcpy(current->lpData + current->dwUser,data,size);
                        current->dwUser += size;
                        break;
                  }
       
                  remain = BLOCK_SIZE-current->dwUser;
                  memcpy(current->lpData+current->dwUser,data,remain);
                  size -= remain;
                  data += remain;
                  current->dwBufferLength = BLOCK_SIZE;
                  waveOutPrepareHeader(hWaveOut,current,sizeof(WAVEHDR));
                  waveOutWrite(hWaveOut,current,sizeof(WAVEHDR));
       
                  waveFreeBlockCount--;
       
                  while(!waveFreeBlockCount) Sleep(5);
       
                  waveCurrentBlock++;
                  waveCurrentBlock %= BLOCK_COUNT;
                  cout << "" << waveCurrentBlock;
                  current = &waveBlocks[waveCurrentBlock];
                  current->dwUser = 0;
            }
            return;
      }
      int main()
      {
      HWAVEOUT hWaveOut;
      HANDLE hFile;
      WAVEFORMATEX wfx;
      char buffer[1024]; /* промежуточный буфер чтения */
      int i;
       
      waveBlocks = allocateBlocks(BLOCK_SIZE, BLOCK_COUNT);
      waveFreeBlockCount = BLOCK_COUNT;
      waveCurrentBlock= 0;
       
      if((hFile = CreateFile(
      "D:\\b.wav",
      GENERIC_READ,
      FILE_SHARE_READ,
      NULL,
      OPEN_EXISTING,
      0,
      NULL
      )) == INVALID_HANDLE_VALUE) {
      printf("неудается открыть файл\n");
      getchar();
      }
       
      wfx.nSamplesPerSec = 44100;
      wfx.wBitsPerSample = 16;
      wfx.nChannels= 2; wfx.wFormatTag = WAVE_FORMAT_PCM;
      wfx.nBlockAlign = (wfx.wBitsPerSample * wfx.nChannels) / 8 ;
      wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;
       
      if(waveOutOpen(
      &hWaveOut,
      WAVE_MAPPER,
      &wfx,
      (DWORD_PTR)waveOutProc,
      (DWORD_PTR)&waveFreeBlockCount,
      CALLBACK_FUNCTION
      ) != MMSYSERR_NOERROR) {
      printf("не удалось открыть устройство");
      getchar();
      ExitProcess(1);
      }
       
      while(1) {
      DWORD readBytes;
      if(!ReadFile(hFile, buffer, sizeof(buffer), &readBytes, NULL))
      break;
      writeAudio(hWaveOut, buffer, sizeof(buffer));
      }
       
      waveOutUnprepareHeader(hWaveOut, &waveBlocks[i], sizeof(WAVEHDR));
      freeBlocks(waveBlocks);
      waveOutClose(hWaveOut);
      CloseHandle(hFile);
      return 0;
      }

    вот этот цикл выполняется бесконечно(после того как файл уже проигрался):
    ExpandedWrap disabled
      while(1) {
      DWORD readBytes;
      if(!ReadFile(hFile, buffer, sizeof(buffer), &readBytes, NULL))
      break;
      writeAudio(hWaveOut, buffer, sizeof(buffer));
      }

    т.е. он не дает выполниться вот этому фрагменту,
    ExpandedWrap disabled
      waveOutUnprepareHeader(hWaveOut, &waveBlocks[i], sizeof(WAVEHDR));
      freeBlocks(waveBlocks);
      waveOutClose(hWaveOut);
      CloseHandle(hFile);
      return 0;

    подскажите путь решения проблемки.
      Цитата MSDN
      The ReadFile function checks for the end-of-file condition (EOF) differently for synchronous and asynchronous read operations. When a synchronous read operation gets to the end of a file, ReadFile returns TRUE and sets the variable pointed to by the lpNumberOfBytesRead parameter to zero.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0225 ]   [ 15 queries used ]   [ Generated: 9.12.24, 20:47 GMT ]