主题 : tiny6410的ALSA编程出现IOCTR错误! 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 3629
精华: 0
发帖: 71
金钱: 365 两
威望: 73 点
综合积分: 142 分
注册时间: 2009-01-27
最后登录: 2020-04-08
楼主  发表于: 2012-05-15 11:08

 tiny6410的ALSA编程出现IOCTR错误!

tiny6410的ALSA编程出现IOCTR错误!
终端打印信息:
[root@FriendlyARM alsa]# ./alsa_readwrite
        snd_pcm_open successed
        snd_pcm_hw_params successed!
        param output!
        0
        1
error from read: Inappropriate ioctl for device

应用程序代码:

/* Use the newer ALSA API */
#define ALSA_PCM_NEW_HW_PARAMS_API

/* All of the ALSA library API is defined
* in this header */
#include <alsa/asoundlib.h>
#include <stdio.h>

int main()
{
    long loops;
    int rc;
    int size;
    snd_pcm_t *handle;
    snd_pcm_hw_params_t *params;
    unsigned int val, val2;
    int dir;
    snd_pcm_uframes_t frames;
    char *buffer;
    
    /* Open PCM device for playback. */
    rc = snd_pcm_open(&handle, "default",SND_PCM_STREAM_PLAYBACK, 0);
    if (rc < 0) {
        fprintf(stderr,"unable to open pcm device: %s\n",snd_strerror(rc));
        exit(1);
    }
    else
    {
        printf("\tsnd_pcm_open successed\n");
    }
    
    /* Allocate a hardware parameters object. */
    snd_pcm_hw_params_alloca(&params);
    
    /* Fill it in with default values. */
    snd_pcm_hw_params_any(handle, params);
    
    /* Set the desired hardware parameters. */
    
    /* Interleaved mode */
    snd_pcm_hw_params_set_access(handle, params,SND_PCM_ACCESS_RW_INTERLEAVED);
    
    /* Signed 16-bit little-endian format */
    snd_pcm_hw_params_set_format(handle, params,SND_PCM_FORMAT_S16_LE);
    
    /* Two channels (stereo) */
    snd_pcm_hw_params_set_channels(handle, params, 2);
    
    /* 44100 bits/second sampling rate (CD quality) */
    val = 44100;
    snd_pcm_hw_params_set_rate_near(handle,params, &val, 0);//&dir
    
    /* Write the parameters to the driver */
    rc = snd_pcm_hw_params(handle, params);
    if (rc < 0) {
        fprintf(stderr,"unable to set hw parameters: %s\n",snd_strerror(rc));
        exit(1);
    }
    else
    {
        printf("\tsnd_pcm_hw_params successed!\n");
    }
    printf("\tparam output!\n");

    /* Use a buffer large enough to hold one period */
    snd_pcm_hw_params_get_period_size(params, &frames,
                                &dir);
    size = frames * 4; /* 2 bytes/sample, 2 channels */
    buffer = (char *) malloc(size);
    
    /* We want to loop for 5 seconds */
    snd_pcm_hw_params_get_period_time(params,
                                &val, &dir);
    /* 5 seconds in microseconds divided by
    * period time */
    loops = 5000000 / val;
    
    while (loops > 0)
    {
        loops--;
        rc = snd_pcm_readi(handle, buffer, frames);
        if (rc == -EPIPE)
        {
        /* EPIPE means overrun */
        fprintf(stderr, "overrun occurred\n");
        snd_pcm_prepare(handle);
        }
        else if (rc < 0)
            {
                  fprintf(stderr,"error from read: %s\n",snd_strerror(rc));
            }
        else if (rc != (int)frames)
            {
                  fprintf(stderr, "short read, read %d frames\n", rc);
            }
        rc = write(1, buffer, size);
        if (rc != size)
              fprintf(stderr,"short write: wrote %d bytes\n", rc);
    }
    
    snd_pcm_drain(handle);
    snd_pcm_close(handle);
    free(buffer);
    

    return 0;
}
求版主解答!QQ252501870
级别: 侠客
UID: 3629
精华: 0
发帖: 71
金钱: 365 两
威望: 73 点
综合积分: 142 分
注册时间: 2009-01-27
最后登录: 2020-04-08
1楼  发表于: 2012-05-15 11:52
能给出音频设置的参数吗?
级别: 侠客
UID: 3629
精华: 0
发帖: 71
金钱: 365 两
威望: 73 点
综合积分: 142 分
注册时间: 2009-01-27
最后登录: 2020-04-08
2楼  发表于: 2012-05-15 15:03
顶起~谁能帮帮我!
^很多问题的背后都是简单的原因......
级别: 荣誉会员
UID: 34780
精华: 0
发帖: 1219
金钱: 6230 两
威望: 1246 点
综合积分: 2438 分
注册时间: 2010-12-21
最后登录: 2017-09-18
3楼  发表于: 2012-05-16 09:50
建议参考aplay.c
也可以直接先用aplay.c,基于它进行修改,不用多少时间,就能解决的~