|
本帖最后由 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 ;
}
|
|