none
录音waveinopen消息没传到WAV_IOControl()??请教这个问题 RRS feed

  • 问题

  • 先说下

    ARM芯片at91sam9260。wince5.0

    音频驱动用的是MDD/PDD模式的。
    用waveoutopen放音,在WAV.c里的WAV_IOControl()加输出调试语句,能输出信息。
    MMRESULT waveInOpen(
      LPHWAVEIN phwi, 
      UINT uDeviceID, 
      LPCWAVEFORMATEX pwfx, 
      DWORD dwCallback, 
      DWORD dwInstance, 
      DWORD fdwOpen 
    ); 

     m_WaveFormatEx.channel = 1;
     m_WaveFormatEx.samples = 8000;
     m_WaveFormatEx.bits = 16;
     m_WaveFormatEx.wFormatTag=WAVE_FORMAT_PCM;
     m_WaveFormatEx.cbSize=0; //When the wFormatTag is PCM, the parameter is abort.
     m_WaveFormatEx.nChannels = 1;
     m_WaveFormatEx.nSamplesPerSec = 44100;

     int ret=waveInOpen(&m_hWaveIn,0,&m_WaveFormatEx,(DWORD)WaveInProc,NULL,CALLBACK_FUNCTION);
     if (ret != MMSYSERR_NOERROR )
     {
      printf("waveInOpen failed %d\r\n",ret);
     }

    但是用waveinopen()时uDeviceID=WAVE_MAPPER时函数能返回32,即WAVERR_UNPREPARED。
    现在把uDeviceID=0函数返回2,即MMSYSERR_BADDEVICEID。
    但是不管这两种情况的哪一种都没有进入MDD层的WAV_IOControl()函数,如果进入此函数就打印出消息来,但是在哪里返回的这两个错误信息呢?

    2010年7月19日 3:03

答案

  • 看看你的驱动程序是否支持44.1KHz, 16bit mono的recording mode吗?

    看看你的板子在power up的时候,audio pdd里面对WPDM_GETDEVCAPS message返回的值是什么?

    2010年7月19日 4:47
    版主

全部回复

  • 注册表有没有关于设备是输入还是输出的参数设置?
    2010年7月19日 3:29
  • 注册表里应该没有这方面的设置。你试一下这段code看看能不能打开。

     

    int WINAPI WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR     lpCmdLine,
                         int       nCmdShow)
    {
     MMRESULT     mmRtn;
     HWAVEIN hIn;
     HANDLE hComp;
     WAVEHDR      wh;
     DWORD dwBufferLength;
     BYTE* data;
     
     HWAVEOUT hwo = NULL;
     
     WAVEFORMATEX wfx = { WAVE_FORMAT_PCM, 1, 44100, 44100*2, 2, 16, 0 };

     hComp = CreateEvent( NULL, FALSE, FALSE, NULL );
     mmRtn = waveInOpen( &hIn, WAVE_MAPPER, &wfx,
                (DWORD)( hComp ), 0, CALLBACK_EVENT );
     
     dwBufferLength = 2*44100*5;
     data = new BYTE[dwBufferLength];
     ZeroMemory( data, dwBufferLength );
     ZeroMemory( &wh, sizeof( WAVEHDR ) );
     wh.lpData         = (char *)data;
        wh.dwBufferLength = dwBufferLength;
        wh.dwLoops        = 0;
        wh.dwFlags        = 0;

     mmRtn = waveInPrepareHeader( hIn, &wh, sizeof( wh ) );
     
     waveInStart( hIn );
     
     mmRtn = waveInAddBuffer( hIn, &wh, sizeof( wh ) );
     
     Sleep(5000);
     
     
     mmRtn = waveInUnprepareHeader( hIn, &wh, sizeof( wh ) );
     mmRtn = waveInStop( hIn );
     mmRtn = waveInClose( hIn );

    return 0;

    }

    2010年7月19日 3:54
    版主
  • 谢谢,待会再看看返回的错误代码,我只负责驱动,应用测试其他人负责
    2010年7月19日 4:15
  • 不行,没有消息到WAV_IOCONTROL()函数,现在是只要进WAV_IOCOTROL就会打印一条消息,而不管是什么消息。对于放音地消息都是可以打印信息的。
    2010年7月19日 4:21
  • 看看你的驱动程序是否支持44.1KHz, 16bit mono的recording mode吗?

    看看你的板子在power up的时候,audio pdd里面对WPDM_GETDEVCAPS message返回的值是什么?

    2010年7月19日 4:47
    版主
  • audio pdd里面对WPDM_GETDEVCAPS message对应的是函数是private_WaveGetDevCaps()这个函数,这个函数在什么阶段调用,初始化时调用?还是打开音频输入时调用?
    2010年7月19日 6:07
  • 是的,在初始化时候调用。

    2010年7月19日 6:23
    版主
  • 谢谢先,现在waveinopen()函数发出的消息MDD能到WAV_IOCOTROL()函数了。剩下接着就是调录音驱动了。

         原来waveinopen()函数发出的消息不能到MDD的WAV_IOCOTROL()函数问题原因是private_WaveGetDevCaps()函数原来的时候对录音部分没有设定,仅对放音设备做了设定,增加录音部分的初始化就可以。

         现在把private_WaveGetDevCaps()中的录音的部分代码贴在这里(参考PXA25X对应的音频驱动代码改的)

     MMRESULT
    private_WaveGetDevCaps(
            WAPI_INOUT apidir,
            PVOID pCaps,
            UINT  wSize
            )
    {
     
        PWAVEOUTCAPS pwoc = pCaps;
      PWAVEINCAPS pwic = pCaps;
        MMRESULT mmRet = MMSYSERR_NOERROR;
     // PWAVEOUTCAPS pwoc = pCaps;
        RETAILMSG( WAVEDEV_DEBUG, (TEXT( "private_WaveGetDevCaps\r\n" )) );

     if (pCaps == NULL)  {
      //
      // If pCaps == NULL, we are requesting if the driver PDD is capable of
      // this mode at all. In other words, if APIDIR == WAPI_IN,  we return
      // no error if input is supported, and MMSYSERR_NOTSUPPORTED otherwise.
      if( WAPI_IN == apidir)
       return( MMSYSERR_NOERROR );
      else // ( WAPI_OUT == apidir)
       return( MMSYSERR_NOERROR );
        }

         //
        // Fill in the DevCaps here.
        //
        if (apidir == WAPI_OUT)
        {  
            pwoc->wMid = MM_MICROSOFT;
            pwoc->wPid = 24;
            pwoc->vDriverVersion = 0x0001;
            wsprintf (pwoc->szPname, TEXT("AT73C213  Stereo (%hs)"), __DATE__);
            pwoc->dwFormats =   WAVE_FORMAT_4S16;
      pwoc->wChannels = 2;    
            pwoc->dwSupport = WAVECAPS_VOLUME;
        }
      else
      {
       DEBUGMSG(ZONE_VERBOSE, (TEXT("API_IN\r\n" )) );
       pwic->wMid = MM_MICROSOFT;  //TODO: this says microsoft wrote this driver, change to intel
       pwic->wPid = (apidir == WAPI_OUT ? 24 : 23);  // generic in or out...
       pwic->vDriverVersion = 0x0001;
       wsprintf (pwoc->szPname, TEXT("AC '97 Stereo (%hs)"), __DATE__);
       pwic->dwFormats =  WAVE_FORMAT_1M08 |
            WAVE_FORMAT_1M16 |
            WAVE_FORMAT_1S08 |
            WAVE_FORMAT_1S16 |
            WAVE_FORMAT_2M08 |
            WAVE_FORMAT_2M16 |
            WAVE_FORMAT_2S08 |
            WAVE_FORMAT_2S16 |
            WAVE_FORMAT_4M08 |
            WAVE_FORMAT_4M16 |
            WAVE_FORMAT_4S08 |
            WAVE_FORMAT_4S16;
       pwic->wChannels = 2;
       }
          
      
        return(MMSYSERR_NOERROR);
    }
    希望大家交流,有问题可以发帖交流。

    2010年7月19日 6:39
  • 顺便问一下,你们用9260做什么产品的阿?

    2010年7月19日 6:57
    版主
  •      你指的初始化是系统初始化时还是在调用录音时才初始化?录音调用时在打印的WAV_IOCOTROL()并未打印出此消息,说明录音操作前某个时间已经被初始化了,但不知具体何时。

       我用9260做工业控制方面需要录放音。你是atmel的还是也用atmel的ARM?

    2010年7月19日 7:20
  • 我是说系统初始化。

    我是atmel的,幸会。

    2010年7月19日 7:22
    版主
  • 哦,这么好,atmel的资料相对三星的比较少的,有问题除了看资料也没的人问,呵呵。我们改用wm8731增加录音功能,放音功能适当修改SPI寄存器控制就搞好了,并且atmel的驱动里结合自己的语音芯片AT73C213做了驱动,因为芯片本身没有录音,并且是MDD/PDD模型的驱动结构,所以我们改用wm8731增加录音功能,问很多人做三星芯片驱动的都说直接用的源码带的,没改过,也不知道。现在wm8731的录音也还在调试。你们atmel提供这方面相关的驱动资料吗?
    2010年7月19日 7:43
  • 我们的AT91SAM9G20EK倒是用WM8731的,但是也只是播放,没有录音功能。

    2010年7月19日 7:52
    版主
  • 你一般都在这论坛提供atmel的帮助?一般atmel有没有服务列表或论坛之类的?
    2010年7月19日 7:55
  • 我在这里是个人爱好,跟公司没有关系的。atmel论坛么,在www.at91.com  上面有一个WinCE的英文论坛,方便的话可以去看看。

    2010年7月19日 8:02
    版主
  • 哦既然芯片本身有录音功能为什么不一块提供录音驱动呢?省的用你们芯片的每个人都得费很多时间去完成驱动的编写调试?
    2010年7月19日 8:04
  • 呵呵,这个你可以跟我们sales那里反映一下。

    2010年7月19日 8:17
    版主
  • 个人爱好,我们就是非官方交流了,呵呵。不过你们对自己的芯片肯定是很熟悉了。

    关于这问题我是不是直接用邮件联系你们销售就可以了,是不是在你们网页上随意找个销售邮件联系就好了?

    2010年7月19日 8:26
  • 一般来说,还是先联系卖给你们芯片的distributor,看看他们能不能搞定,如果不行的话,他们会找我们这里的。

    2010年7月19日 8:30
    版主
  • 好的,谢谢先,我们买的杭州启扬的,他们也和你们一样用的只放音没录音的芯片,找过几次,他们因为没做板子所以一直没给解决,我们又着急用所以就自己调了。
    2010年7月19日 8:49
  • 说变问下,你用的msn?是不是我回复了你就会收到我的信息,而不用登陆网页?我现在每次都刷新网页。
    2010年7月19日 8:50
  • 好像这个forum可以发alert给hotmail邮箱的
    2010年7月19日 9:10
    版主
  • 哦,我是163邮箱,汗
    2010年7月19日 9:32
  • 我换成hotmail的登录,浏览信息方便些。不知你有兴趣看下我改的录音驱动吗?我改的有点问题,在将得到的数据考到传给应用的参数时可能数量计算不对,总提示错误,如果有兴趣我可以给你,你帮我看下有什么问题,谢谢先。
    2010年7月19日 13:14
  • 可以阿,不过我没有办法作test,不一定能帮你搞定。
    2010年7月20日 1:31
    版主
  • 没事你看看我写的逻辑或者哪个地方有疏忽就可以了,调试我可以慢慢调,到时再和你沟通
    2010年7月20日 1:32
  • 行啊,那你发到我gmail吧。guangyu.ren@gmail.com

    我回头有空帮你看看

    2010年7月20日 1:36
    版主
  • 好的,我刚要找你email,微软这个论坛连对方email也看不到,并且不能加好友。谢谢先。
    2010年7月20日 1:39