查找出现“wait_event_timeout failed for session X”的原因

原创 2012年03月29日 20:42:18

查找出现“wait_event_timeout failed for session X”的原因

1 Audio相关代码文件

Sound/soc/msm/qdsp6/q6asm.c

Sound/soc/msm/qdsp6/q6adm.c

Sound/soc/msm/qdsp6/q6afe.c

Sound/soc/msm/msm8x60-dai.c

Sound/soc/msm/msm8x60.c

Sound/soc/msm/msm8x60-pcm.c

Sound/soc/msm/snd-soc-lpass-dma.c

Sound/soc/codec/wnc/wnc/wnc_wm8737.c

Arch/arm/mach-msm/qdsp6v2/pcm_out.c

Arch/arm/mach-msm/qdsp6v2/pcm_in.c

Hardware/qcom/media/audio/msm8660/

 

2Arch/arm/mach-msm/qdsp6v2/pcm_out.c

static ssize_t pcm_out_write(struct file *file, const char __user *buf,

                                               size_t count, loff_t *pos)

{

。。。。。。

                   rc = wait_event_timeout(pcm->write_wait,

                                     (atomic_read(&pcm->out_count) ||

                                     atomic_read(&pcm->out_stopped)), 1 * HZ );

                   if (!rc) {

                            pr_err("%s: wait_event_timeout failed for session %d\n",

                                     __func__, pcm->ac->session);

                            goto fail;

                   }

。。。。。。

rc = q6asm_write(pcm->ac, xfer, 0, 0, NO_TIMESTAMP);

。。。。。。

                   atomic_dec(&pcm->out_count);

。。。。。。

}

 

pcm->out_count为目前闲着的buffer个数。向底层每写入1buffer数据,out_count1.

 

3  pcm_out_cb()为回调函数,当底层写完数据后进入,out_count1.

void pcm_out_cb(uint32_t opcode, uint32_t token,

                            uint32_t *payload, void *priv)

{

         struct pcm *pcm = (struct pcm *) priv;

         unsigned long flags;

         spin_lock_irqsave(&pcm->dsp_lock, flags);

         switch (opcode) {

         case ASM_DATA_EVENT_WRITE_DONE:

                   atomic_inc(&pcm->out_count);

                   wake_up(&pcm->write_wait);

                   break;

         default:

                   break;

         }

         spin_unlock_irqrestore(&pcm->dsp_lock, flags);

}

4 atomic_read(&pcm->out_count)等于0时,证明没有闲着的buffer,等1秒钟,仍然没有可以用的buffer,则打印“wait_event_timeout failed for session X”,向上返回0.

若底层有问题,数据传不下去,则会不停的报“wait_event_timeout failed for session X”,若只报一次,证明下次就正常了,所以问题不大。

 

5 HAL层向下写入的过程:

ssize_t AudioHardware::AudioStreamOutMSM72xx::write(const void* buffer, size_t bytes)

{

if (mStandby) {

        // open driver

        status = ::open("/dev/msm_pcm_out", O_WRONLY/*O_RDWR*/);

    // configuration

        status = ioctl(mFd, AUDIO_GET_CONFIG, &config);

        config.channel_count = AudioSystem::popCount(channels());

        config.sample_rate = sampleRate();

        config.buffer_size = bufferSize();

        config.buffer_count = AUDIO_HW_NUM_OUT_BUF;

        config.codec_type = CODEC_TYPE_PCM;

        status = ioctl(mFd, AUDIO_SET_CONFIG, &config);

        // fill 2 buffers before AUDIO_START

        mStartCount = AUDIO_HW_NUM_OUT_BUF;

        mStandby = false;

    }

    while (count) {

        ssize_t written = ::write(mFd, p, count);

        if (written > 0) {

            count -= written;

            p += written;

        } else {

            if (errno != EAGAIN) return written;

            mRetryCount++;

            LOGW("EAGAIN - retry");

        }

    }

    // start audio after we fill 2 buffers

    if (mStartCount) {

        if (--mStartCount == 0) {

            if(ioctl(mFd, AUDIO_GET_SESSION_ID, &dec_id)) {

                LOGE("AUDIO_GET_SESSION_ID failed*********");

                return 0;

            }

            ioctl(mFd, AUDIO_START, 0);

        }

    }

return bytes;

}

通过ioctl(mFd, AUDIO_SET_CONFIG, &config);将配置传下去。(Buffersize=4800buffercount=2)。

先写入两个buffer,再ioctl(mFd, AUDIO_START, 0);然后再继续写。底层接到AUDIO_START命令后,会设置音量等。猜想这样做可能是为了消除pop音。

 6 音频设备

输入(1)遥控器 usb声卡 pcm1804_mic_tx

      (2)卡拉OK CODEC

输出 HDMI hdmi_stereo_rx

wait_event_timeout的理解

wait_event_timeout(wq, condition, timeout) 表示的有以下两个意思: (1)当condition为真的时候,会返回 (2)当timeout到达...
  • lhl161123
  • lhl161123
  • 2017年01月10日 22:28
  • 1577

SharePoint 2010 Configuration Failed

最近一些学员部署SharePoint 2010的时候,Configuration Failed,提示信息如下:   Failed to create theconfiguration data...
  • ShelleyLiu0415
  • ShelleyLiu0415
  • 2015年10月28日 15:40
  • 888

samba错误:session setup failed: NT_STATUS_LOGON_FAILURE

在命令行输入命令: ~$ smbclient -L \\127.0.0.1 按要求输入密码后,提示出错: session setup failed: NT_STATUS_LOGON_FAILUR...
  • x875227668
  • x875227668
  • 2015年07月28日 13:55
  • 5871

STM32如何查找hardfault原因

STM32出现HardFault_Handler故障的原因主要有两个方面: 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。   ...
  • u013385925
  • u013385925
  • 2016年04月13日 09:54
  • 1391

Session丢失的原因以及处理方式

在ASP.NET的开发中,总遇到Session丢失.最常见的情况是当用户登录后将用户信息保存在Session中例如Session["user"]=user;在其后的页面中检查Session["user...
  • flamelp
  • flamelp
  • 2010年02月22日 14:01
  • 18699

phpstorm连接sftp报错:session is down

之前项目的sftp都是好好的,结果在一次项目上线之后,sftp突然连不上了,用phpstorm连接报错:session is down 换了flashfxp连接,发现还是连不上。 从上图可...
  • maquealone
  • maquealone
  • 2017年06月23日 10:35
  • 837

phpMyAdmin - Error:Failed to generate random CSRF token!

如果phpmyadmin报错:Error:Failed to generate random CSRF token!需要检查一下php.ini中的 session.save_path 的配置解决方式:...
  • m0_37886429
  • m0_37886429
  • 2017年07月12日 14:54
  • 1135

session失效问题的可能原因

最近写网页,发现session只要一分钟就会失效(取不出存在session里的值),设置了session的最大不活动时间为30分钟,但是依然过一分钟session就失效了,然后给session加了生死...
  • aa8568849
  • aa8568849
  • 2017年05月02日 11:30
  • 1114

Android开发使用小米手机调试出现Installation failed with message Failed to establish session

问题Android studio升级到2.3后,使用小米5S手机调试的时候出现如下错误: 解决在开发者选项里关闭MIUI优化即可...
  • Alpha58
  • Alpha58
  • 2017年04月18日 13:18
  • 3633

Mint17.3/Ubuntu14.04出现failed to start the X server ...错误的解决办法

Mint17.3/Ubuntu14.04出现failed to start the X server …错误的解决办法自己的主力电脑Mint17.3昨天晚上还好好的,但今天早上突然罢工,症状表现在系统...
  • sailor201211
  • sailor201211
  • 2016年08月23日 11:39
  • 1046
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:查找出现“wait_event_timeout failed for session X”的原因
举报原因:
原因补充:

(最多只允许输入30个字)