hi
i am getting some problem with OSS driver.
I create two files.
1.loopback.c
It read the pcm sample and play the sample and
write in to a file as pcm samples.
2.fileread.c
It reads the pcm samples file which is written
by loopback.c
Issues:
1.if i run the loopback.c and fileread.c in a
DAVINCI Board ,It is running perfectly.
2.if i run the loopback.c and fileread.c in a x386
Machine(Fedora core 5), ,It is running perfectly.
But
3.if i run the loopback.c in DAVINCI and fileread.c
in x386 Machine(Fedora core 5),it is not working
properly.
4.if i run the loopback.c in x386 Machine(Fedora
core 5),and fileread.c in DAVINCI ,it is not working
properly.
what might be the reson.?
I have given the code also..
-----------------------loopback.c---------------------------------------------------------------------------------------------------------------------
/*
*
*
============================================================================
/* Standard Linux headers */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <signal.h>
#include <getopt.h>
#include <pthread.h>
#include <errno.h>
#include <linux/soundcard.h>
#define FAILURE -1
/* The number of channels of the audio codec */
#define NUM_CHANNELS 1
/* The sample rate of the audio codec */
#define SAMPLE_RATE 8000
/* The gain (0-100) of the left and right channels
*/
#define LEFT_GAIN 100
#define RIGHT_GAIN 100
/* Number of samples to process */
#define NUMSAMPLES 320
/* Mono 16 bit */
#define RAWBUFSIZE NUMSAMPLES * 2
/* Stereo 16 bit */
#define INPUTBUFSIZE NUMSAMPLES * 2
unsigned short
rawbuf[RAWBUFSIZE],inputbuf[INPUTBUFSIZE];
int main()
{
int vol = LEFT_GAIN | (RIGHT_GAIN << 8);
int channels = NUM_CHANNELS;
int sampleRate = SAMPLE_RATE;
int format = AFMT_S16_LE;
int soundFd;
int mixerFd;
int recMask;
/* Open the sound device for writing */
if ((soundFd = open("/dev/dsp", O_RDWR)) == -1) {
printf("Failed to open the sound device
(/dev/dsp)\n");
return FAILURE;
}
/* Set the sound format (only AFMT_S16_LE supported)
*/
if (ioctl(soundFd, SNDCTL_DSP_SETFMT, &format) ==
-1) {
printf("Could not set format %d\n", format);
return FAILURE;
}
/* Set the number of channels */
if (ioctl(soundFd, SNDCTL_DSP_CHANNELS, &channels)
== -1) {
printf("Could not set mixer to %d channels\n",
channels);
return FAILURE;
}
/* Set the sample rate */
if (ioctl(soundFd, SNDCTL_DSP_SPEED, &sampleRate) ==
-1) {
printf("Could not set sample rate (%d)\n",
sampleRate);
return FAILURE;
}
/* If we are sampling select the right capture
device and volume */
if ((mixerFd = open("/dev/mixer", O_RDONLY)) == -1)
{
printf("Failed to open /dev/mixer\n");
return FAILURE;
}
recMask |= SOUND_MASK_MIC;
if (ioctl(mixerFd, SOUND_MIXER_WRITE_RECSRC,
&recMask) == -1) {
perror("Failed to ask mixer for available recorders
-- 1.\n");
return FAILURE;
}
if (ioctl(mixerFd, SOUND_MIXER_READ_RECMASK,
&recMask) == -1) {
printf("Failed to ask mixer for available recorders
-- 2.\n");
return FAILURE;
}
//if ((recMask & SOUND_MASK_LINE) == 0) {
if ((recMask & SOUND_MASK_MIC) == 0) {
printf("Line input not a supported recorder.\n");
return FAILURE;
}
if (ioctl(mixerFd, SOUND_MIXER_READ_RECSRC,
&recMask) == -1) {
printf("Failed to read the current recorder.\n");
return FAILURE;
}
//recMask |= SOUND_MASK_LINE;
recMask |= SOUND_MASK_MIC;
if (ioctl(mixerFd, SOUND_MIXER_WRITE_RECSRC,
&recMask) == -1) {
printf("Failed to set line input as recorder.\n");
return FAILURE;
}
if (ioctl(mixerFd, SOUND_MIXER_READ_RECSRC,
&recMask) == -1) {
printf("Failed to read the current recorder.\n");
return FAILURE;
}
//if ((recMask & SOUND_MASK_LINE) == 0) {
if ((recMask & SOUND_MASK_MIC) == 0) {
printf("Failed to read the current recorder.\n");
return FAILURE;
}
if (ioctl(mixerFd, SOUND_MIXER_WRITE_IGAIN, &vol) ==
-1) {
printf("Failed to set the volume of line in.\n");
return FAILURE;
}
close(mixerFd);
printf("Audio sample rate set to %dHz\n",
SAMPLE_RATE);
int outputFd = open("audio",O_WRONLY | O_CREAT |
O_TRUNC, 00644);
int i=0,numBytes;
if (outputFd == -1) {
printf("Failed to open file for writing\n");
exit(0);
}
while(i++<500)
{
numBytes=read(soundFd, inputbuf, INPUTBUFSIZE);
if(numBytes==-1)
{
printf("error\n");
exit(0);
close(outputFd);
}
else{
printf("numBytes=%d\n",numBytes);
}
usleep(10);
write(soundFd, inputbuf, INPUTBUFSIZE);
//stereoToMono(inputbuf, rawbuf, NUMSAMPLES);
if (write(outputFd, inputbuf, INPUTBUFSIZE) == -1) {
printf("Error writing the encoded \n");
close(outputFd);
exit(0);
}
}
close(outputFd);
close(soundFd);
return 0;
}
------------------------------------end of
loopback.c---------------------------------------------------------------------------------------------------
------------------------------------------fileread.c
----------------------------------------------------------------------------------------------------
/* Standard Linux headers */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <signal.h>
#include <getopt.h>
#include <pthread.h>
#include <errno.h>
#include <linux/soundcard.h>
#define FAILURE -1
/* The number of channels of the audio codec */
#define NUM_CHANNELS 1
/* The sample rate of the audio codec */
#define SAMPLE_RATE 8000
/* The gain (0-100) of the left and right channels
*/
#define LEFT_GAIN 100
#define RIGHT_GAIN 100
/* G.711 encoded samples */
#define NUMSAMPLES 640
/* The size of the read buffer */
#define READBUFSIZE NUMSAMPLES*2
#if 0
monoTostereo(inBuf,outBuf,inBufSize,outBufSize)
{int i, * bytesProcessed=0;
for (i = (inBufSize - 1); i >= 0; i--) {
outBuf[4 * i] = outBuf[2 * i];
outBuf[4 * i + 1] = outBuf[2 * i + 1];
outBuf[4 * i + 2] = outBuf[2 * i];
outBuf[4 * i + 3] = outBuf[2 * i + 1];
}
if (inBufSize < NUMSAMPLES) {
*bytesProcessed = inBufSize;
*outBufSize = inBufSize * 4;
}
else {
*bytesProcessed = NUMSAMPLES;
*outBufSize = NUMSAMPLES * 4;
}
}
#endif
int main()
{
int vol = LEFT_GAIN | (RIGHT_GAIN << 8);
int channels = NUM_CHANNELS;
int sampleRate = SAMPLE_RATE;
int format = AFMT_S16_LE;
int soundFd;
int mixerFd;
int recMask;
unsigned short readBuffer[3072],rawBuffer[3072];
/* Open the sound device for writing */
if ((soundFd = open("/dev/dsp", O_RDWR)) == -1) {
printf("Failed to open the sound device
(/dev/dsp)\n");
return FAILURE;
}
/* Set the sound format (only AFMT_S16_LE supported)
*/
if (ioctl(soundFd, SNDCTL_DSP_SETFMT, &format) ==
-1) {
printf("Could not set format %d\n", format);
return FAILURE;
}
/* Set the number of channels */
if (ioctl(soundFd, SNDCTL_DSP_CHANNELS, &channels)
== -1) {
printf("Could not set mixer to %d channels\n",
channels);
return FAILURE;
}
/* Set the sample rate */
if (ioctl(soundFd, SNDCTL_DSP_SPEED, &sampleRate) ==
-1) {
printf("Could not set sample rate (%d)\n",
sampleRate);
return FAILURE;
}
/* If we are sampling select the right capture
device and volume */
if ((mixerFd = open("/dev/mixer", O_RDONLY)) == -1)
{
printf("Failed to open /dev/mixer\n");
return FAILURE;
}
recMask |= SOUND_MASK_MIC;
if (ioctl(mixerFd, SOUND_MIXER_WRITE_RECSRC,
&recMask) == -1) {
perror("Failed to ask mixer for available recorders
-- 1.\n");
return FAILURE;
}
if (ioctl(mixerFd, SOUND_MIXER_READ_RECMASK,
&recMask) == -1) {
printf("Failed to ask mixer for available recorders
-- 2.\n");
return FAILURE;
}
//if ((recMask & SOUND_MASK_LINE) == 0) {
if ((recMask & SOUND_MASK_MIC) == 0) {
printf("Line input not a supported recorder.\n");
return FAILURE;
}
if (ioctl(mixerFd, SOUND_MIXER_READ_RECSRC,
&recMask) == -1) {
printf("Failed to read the current recorder.\n");
return FAILURE;
}
//recMask |= SOUND_MASK_LINE;
recMask |= SOUND_MASK_MIC;
if (ioctl(mixerFd, SOUND_MIXER_WRITE_RECSRC,
&recMask) == -1) {
printf("Failed to set line input as recorder.\n");
return FAILURE;
}
if (ioctl(mixerFd, SOUND_MIXER_READ_RECSRC,
&recMask) == -1) {
printf("Failed to read the current recorder.\n");
return FAILURE;
}
//if ((recMask & SOUND_MASK_LINE) == 0) {
if ((recMask & SOUND_MASK_MIC) == 0) {
printf("Failed to read the current recorder.\n");
return FAILURE;
}
if (ioctl(mixerFd, SOUND_MIXER_WRITE_IGAIN, &vol) ==
-1) {
printf("Failed to set the volume of line in.\n");
return FAILURE;
}
close(mixerFd);
printf("Audio sample rate set to %dHz\n",
SAMPLE_RATE);
int outputFd = open("audio",O_RDONLY, 00444);
if (outputFd == -1) {
printf("Failed to open file for writing\n");
exit(0);
}
while(1)
{
if (read(outputFd, readBuffer, READBUFSIZE) == -1) {
printf("Error reading the encoded \n");
close(outputFd);
exit(0);
}
//monoTostereo(readBuffer,rawBuffer,READBUFSIZE,RAWBUFSIZE);
write(soundFd, readBuffer, READBUFSIZE);
}
close(outputFd);
close(soundFd);
return 0;
}
-----------------
------------------------------------------------------------------------------
Regards,
Ram
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source