天嵌 ARM开发社区

 找回密码
 注册
查看: 1990|回复: 2

tq210 oss播放声音变快,失真

[复制链接]
f117cdh 发表于 2013-5-1 14:24:51 | 显示全部楼层 |阅读模式
本帖最后由 f117cdh 于 2013-5-1 14:26 编辑

oss播放声音变快,失真
我测试了板子上的mp3播放是正常的
我直接用的是windows采集到的pcm数据测试的 采样率:8000 16位 单声道
在ubuntu 用alsa播放声音正常

这是我OSS的程序

LibAudioOutHandle  MYAPI LibAudioOutCreateOutput(const char *szDevName,LibAudioOutFormat *format,

                                                                                                 _LibAudioOutBufferCallback callback,void *usrDataCallback,

                                                                                                 void *callbackThread,unsigned int threadMode)

{

        int handle = -1 ;
        int ret = 0 ;
        LibAudioOutOssPtr audio = NULL ;  
        int r = 0;
        int nBlockAlign = 0 ;
        int nAvgBytesPerSec = 0 ;
        if( szDevName == NULL ||  szDevName[0] == 0 )
        {
                handle = open("/dev/dsp", O_WRONLY);
                if( handle == -1 )
                {
                        return NULL ;
                }
        }
        else
        {
                handle = open( szDevName , O_WRONLY);
                if( handle == -1 )
                {
                        return NULL ;
                }
        }
        audio = (LibAudioOutOssPtr) malloc( sizeof(LibAudioOutOss) );
        if( audio == NULL )
        {
                close( handle ) ;
                return NULL ;
        }
        memset( audio , 0 , sizeof(LibAudioOutOss) );
        audio->handle = handle ;
        audio->format.bitsPerSample = 16 ;
        audio->format.numChannels = 1 ;
        audio->format.samplesPerSec = 8000 ;
        nBlockAlign = (unsigned short int)(( audio->format.numChannels * audio->format.bitsPerSample ) >> 3);

        nAvgBytesPerSec = audio->format.samplesPerSec * nBlockAlign;
        if( format != NULL )
        {
                memcpy( &(audio->format) ,  format , sizeof(LibAudioOutFormat) );
        }

        r=1;

        //ioctl (handle, SNDCTL_DSP_RESET, (char*)&r);

        r = fcntl(handle, F_GETFL, 0);
        fcntl(handle, F_SETFL, r&(~O_NONBLOCK)) ;
        r = ( (4 << 16) + nAvgBytesPerSec );
        //ioctl (handle, SNDCTL_DSP_SETFRAGMENT, (char*)&r);
        r = 3  ;

        //ioctl (handle, SNDCTL_DSP_SETTRIGGER, (char*)&r);
        r = 1  ;
        //ioctl (handle, SNDCTL_DSP_PROFILE, (char*)&r);
        r=1;
        //ioctl (handle, SNDCTL_DSP_SYNC, (char*)&r);
        r=0;

        //ioctl (handle, SNDCTL_DSP_NONBLOCK, (char*)&r);
        r = 0 ;
        if( audio->format.bitsPerSample == 16 )
        {
                r = AFMT_S16_LE ;
        }
        //ioctl (handle, SNDCTL_DSP_SETFMT, (char*)&r);
        r = audio->format.bitsPerSample ;
        ioctl (handle, SOUND_PCM_WRITE_BITS, (char*)&r);
        r  = (audio->format.numChannels == 2 ) ;
        //ioctl (handle, SNDCTL_DSP_STEREO, (char*)&r);  
        r = audio->format.numChannels ;
        //ioctl (handle, SNDCTL_DSP_CHANNELS, (char*)&r);
        ioctl (handle, SOUND_PCM_WRITE_CHANNELS, (char*)&r);
        r = audio->format.samplesPerSec  ;
        //ioctl (handle, SNDCTL_DSP_SPEED, (char*)&r);
        ioctl (handle, SOUND_PCM_WRITE_RATE, (char*)&r);   
        audio->bufferCallback = callback ;

        audio->usrDataCallback = usrDataCallback ;
        audio->adStatus = LibAudioOutStatusPlaying ;
        ListInit( &(audio->head) );
        MtxInit( &(audio->mtx), 0 );
        audio->hEv = EvWaitCreate();
        audio->hThread = Thread2Create( (void *)&ThreadAudioProc , audio, NULL, 0 );
        return audio ;

}


TQ-lkp 发表于 2013-5-2 08:48:13 | 显示全部楼层
要用单通道来播放
 楼主| f117cdh 发表于 2013-5-2 12:41:13 | 显示全部楼层
TQ-lkp 发表于 2013-5-2 08:48
要用单通道来播放

单通道,是单声道么,现在就是单声道,单通道怎么设置,我看了mp3播放器代码的例子,没什么特殊的地方阿
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-17 19:47 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表