На главную Наши проекты:
Журнал   ·   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
  
> Запись с помощью микрофона
    Здравствуйте, пробую записать речевые фрагменты через микрофон с параметрами: PCM, 11025, с разрешением 16 бит на Visual C++. Но файлы сохраняются только с разрешением 8 бит(

    ExpandedWrap disabled
      BOOL CRecorderDlg::OnInitDialog()
      {
          CDialogEx::OnInitDialog();
          ...
          m_MciEx.SetPara ( WAVE_FORMAT_PCM, 1, 11025, 22050, 2, 16); <---задание параметров
       
          return TRUE;  
      }
       
      void CRecorderDlg::OnRecStart()
      {
          UpdateData (true);
          m_IsStored=true;
          m_IsSaved=false;
          GetDlgItem(IDC_REC_START)->EnableWindow (false);
          GetDlgItem(IDC_SAVE_EXIT)->EnableWindow (true);
          GetDlgItem(IDC_BN_STOP)->EnableWindow (true);
          m_MciEx.Rec ();
      }
       
      void CRecorderDlg::OnBnStop()
      {
              m_MciEx.Stop ();
              GetDlgItem(IDC_BN_STOP)->EnableWindow (false);
      }
       
      void CRecorderDlg::OnDestroy()
      {
          if((!m_IsSaved)&&m_IsStored)
      if(MessageBox("Files not be saved! Press OK to do your save or cancel to accept default saving.", NULL,MB_ICONEXCLAMATION|MB_OKCANCEL)==1)
                  OnSaveExit();
              else if(m_MciEx.Save("temp.wav"))
                  MessageBox("File saved to LocalFolder\\temp.wav");
          m_MciEx.Close();
          EndDialog(true);
          CDialogEx::OnDestroy();
      }
       
       
      void CRecorderDlg::OnSaveExit()
      {
          char files[]="Wave Forms (*.wav)|*.wav|";
          CFileDialog FileDlg(false,NULL,NULL,OFN_HIDEREADONLY,files);
       
          if(FileDlg.DoModal()==IDOK){
              m_FilePath=FileDlg.GetFileTitle()+".wav";  <--сохранение
              if ( m_MciEx.Save (m_FilePath)){
                  MessageBox ("File successfully saved!");
                  m_IsSaved=true;
              }
              GetDlgItem(IDC_SAVE_EXIT)->EnableWindow (false);
          }  
          OnDestroy();
      }


    Что же не так? Подскажите, пожалуйста. Большое спасибо.
    Сообщение отредактировано: varvara16 -
      А что такое m_MciEx?


      Мож, последний параметр должен быть = 32 (2 канала то 16 бит)?
        Но у меня всего один канал(

        Вот код MciEx.cpp

        ExpandedWrap disabled
          // MciEx.cpp: implementation of the CMciEx class.
          //
           
          #include "stdafx.h"
          #include "MciEx.h"
          #include <mmsystem.h>
          #pragma comment ( lib, "winmm.lib" )
           
          #ifdef _DEBUG
          #undef THIS_FILE
          static char THIS_FILE[]=__FILE__;
          #define new DEBUG_NEW
          #endif
           
          CMciEx::CMciEx()
              : m_wDeviceID ( NULL )
          {
              memset ( m_szErrorStr, 0, sizeof(m_szErrorStr) );
          }
           
          CMciEx::~CMciEx()
          {
              Close ();
          }
           
          MCIERROR CMciEx::MciExSendCommand(
                  MCIDEVICEID IDDevice,
                  UINT uMsg,            
                  DWORD fdwCommand,      
                  DWORD dwParam
              )
          {
              MCIERROR mciError = ::mciSendCommand ( IDDevice, uMsg, fdwCommand, dwParam );
              if ( mciError != 0 )
              {
                  memset ( m_szErrorStr, 0, sizeof(m_szErrorStr) );
                  mciGetErrorString ( mciError, m_szErrorStr, sizeof(m_szErrorStr) );
          #ifdef _DEBUG
                  AfxMessageBox ( m_szErrorStr );
          #endif
              }
           
              return mciError;
          }
           
          BOOL CMciEx::Open(LPCTSTR lpszWaveFileName/*=NULL*/)
          {
              MCI_OPEN_PARMS OpenParms = {0};
              OpenParms.lpstrDeviceType = (LPCSTR)(lpszWaveFileName?NULL:MCI_DEVTYPE_WAVEFORM_AUDIO);
              OpenParms.lpstrElementName = (LPCSTR)(lpszWaveFileName?lpszWaveFileName:"");    // file name
              m_wDeviceID = NULL;
              if ( MciExSendCommand ( NULL,
                  MCI_OPEN,
                  ( lpszWaveFileName?0:(MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID) ) | MCI_WAIT | MCI_OPEN_ELEMENT,
                  (DWORD)(LPVOID) &OpenParms ) != 0 )
                  return FALSE;
           
              m_wDeviceID = OpenParms.wDeviceID;
              return TRUE;
          }
           
          void CMciEx::Close()
          {
              if ( m_wDeviceID != NULL )
              {
                  MciExSendCommand ( m_wDeviceID, MCI_CLOSE, NULL, NULL );
              }
              m_wDeviceID = NULL;
           
          }
           
          BOOL CMciEx::Play(DWORD dwFrom, DWORD dwTo)
          {
              Stop ();
              MCI_PLAY_PARMS PlayParms = {0};
              PlayParms.dwFrom = dwFrom;  
              PlayParms.dwTo = dwTo;
              if ( MciExSendCommand ( m_wDeviceID, MCI_PLAY, MCI_FROM,
                  (DWORD)(LPVOID)&PlayParms ) != 0 )
                  return FALSE;
           
              return TRUE;
           
          }
           
          BOOL CMciEx::Stop()
          {
              if ( m_wDeviceID == NULL )
              {
                  AfxMessageBox("Device not found.");
                  return FALSE;
              }
           
              return ( MciExSendCommand ( m_wDeviceID, MCI_STOP, NULL, NULL ) == 0 );
          }
           
          BOOL CMciEx::Pause()
          {
              if ( m_wDeviceID == NULL ) return FALSE;
           
              return ( MciExSendCommand ( m_wDeviceID, MCI_PAUSE, NULL, NULL ) == 0 );
          }
           
          BOOL CMciEx::Resume()
          {
              if ( m_wDeviceID == NULL ) return FALSE;
           
              return ( MciExSendCommand ( m_wDeviceID, MCI_RESUME, NULL, NULL ) == 0 );
          }
           
          BOOL CMciEx::Save(CString Filename)
          {
              Stop ();
              MCI_SAVE_PARMS SaveParms = {0};
              SaveParms.lpfilename = (LPCSTR) Filename;
              return ( MciExSendCommand ( m_wDeviceID,
                  MCI_SAVE,
                  MCI_SAVE_FILE | MCI_WAIT,
                  (DWORD)(LPVOID) &SaveParms) == 0 );
          }
           
          LPSTR CMciEx::GetErrorStr()
          {
              return m_szErrorStr;
          }
           
          BOOL CMciEx::Rec ()
          {
              Close ();
              if ( !Open () ) return FALSE;
              //SetPara ( WAVE_FORMAT_PCM, nChannels, 11025, 11025*nChannels, nChannels, 8 );
           
              MCI_RECORD_PARMS RecordParms = {0};
              return ( MciExSendCommand ( m_wDeviceID,
                  MCI_RECORD,
                  NULL,
                  (DWORD)(LPVOID) &RecordParms) == 0 );
          }
           
          BOOL CMciEx::DeviceIDValid()
          {
              return ( m_wDeviceID != NULL );
          }
           
          BOOL CMciEx::SetPara (
                  WORD        wFormatTag,         // format type
                  WORD        nChannels,          // channels
                  DWORD       nSamplesPerSec,     // samples per second
                  DWORD       nAvgBytesPerSec,    // bytes per sample
                  WORD        nBlockAlign,        // block align
                  WORD        wBitsPerSample      // bits per sample
              )
          {
              if ( m_wDeviceID == NULL )
                  return FALSE;
           
              MCI_WAVE_SET_PARMS  SetParms = {0};
              SetParms.wFormatTag = wFormatTag;
              SetParms.nChannels = nChannels;
              SetParms.nSamplesPerSec = nSamplesPerSec;
              SetParms.nAvgBytesPerSec = nAvgBytesPerSec;
              SetParms.nBlockAlign = nBlockAlign;
              SetParms.wBitsPerSample = wBitsPerSample;
           
              return ( MciExSendCommand ( m_wDeviceID, MCI_SET, MCI_WAIT |
                  MCI_WAVE_SET_FORMATTAG | MCI_WAVE_SET_CHANNELS | MCI_WAVE_SET_SAMPLESPERSEC | MCI_WAVE_SET_AVGBYTESPERSEC |
                  MCI_WAVE_SET_BLOCKALIGN | MCI_WAVE_SET_BITSPERSAMPLE,
                  (DWORD)(LPVOID) &SetParms ) == 0 );
           
          }
          А как можно сделать разрешение 16 бит для моно сигнала? Помогите, пожалуйста.
            Цитата
            All parameters in the MCI_WAVE_SET_PARMS struct that apply to recording wave audio should be set at the same time. If some recording parameters are set at one time and the balance of the recording parameters are set at a later time, recording will proceed at a default setting of 8-bits per sample, mono, and 11-kHz sampling.

            http://support.microsoft.com/kb/152180
            Вольный перевод:
            При установке формата все параметры должны передаваться сразу, одним вызовом MCI_SET. Если параметры устанавливаются несколькими вызовами MCI_SET, запись будет выполнена в формате "по умолчанию" 8 бит 11025 Гц моно.

            Проверяйте вашу программу, возможно, причина в этом.

            //SetPara ( WAVE_FORMAT_PCM, nChannels, 11025, 11025*nChannels, nChannels, 8 );
            Эту строку вы закомментировали?
            Сообщение отредактировано: Prince -
              Prince, спасибо огромное!

              Причина была именно в этой строке. Я ввела нужные параметры и все заработало

              ExpandedWrap disabled
                SetPara(WAVE_FORMAT_PCM, 1, 11025, 22050, 2, 16);


              Еще раз спасибо :)
                Причина была и осталась в чём-то другом.
                Заработало потому, что теперь SetPara вызывается непосредственно перед началом записи, в классе CMciEx, так что ваша программа лишена возможности "испортить" формат записи.
                Причина где-то в вашей программе, имхо. Но если вас такой результат устраивает, то так тому и быть.
                :scratch:
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0282 ]   [ 14 queries used ]   [ Generated: 18.05.24, 19:37 GMT ]