hi,
It returns 0 only.So I dont get any error while
setting the format.
any idea?
Ram
M.Ramachandran
Senior Engineer,
Networking Domain(VOIP),
Tata Elxsi Ltd,
Bangalore-48
---- Original message ----
Date: Tue, 20 Feb 2007 12:04:54 +0100
From: Emanuele Ghidoli
<[EMAIL PROTECTED]>
Subject: Re: DAVINCI Open Sound System and x386
Open SOund system Driver Issues
To: Ramachandran M <[EMAIL PROTECTED]>
Cc: [email protected]
Hello,
mmm... can be strange endianess problems? I say
strange because you
set the format as AFMT_S16_LE (LE means little
endian) but... just now
I have see that the ioctl can return ok but the
format can be different
from what you have choosen. You have to check the
format variable!
I have see this at this page:
http://manuals.opensound.com/developer/SNDCTL_DSP_SETFMT.html
This is the description:
Description
This ioctl call selects the sample format to be
used with this stream.
Please see the Supported
audio formats
section for more info about the different audio
formats. The
application should check the argument value after
the call. It contains
the sample format that will be actually be used.
If the application
cannot support this format it should give an error
message and ask the
user to select some other sample format. Using
wrong sample format is a
major error since it may result in very high
volume noise that may
cause hearing damage. Please see the description
of Return
information about an audio device for more
information about the
possible parameters.
and
OSS ioctl return values
The return value from the OSS
ioctl calls will be -1 if a fatal error occurred.
Other values mean
that the ioctl call was more or less successful.
However in most
cases
the application must check the value returned in
the argument to
see
what was the accepted value.
See you
Emanuele Ghidoli
Ramachandran M ha scritto:
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 attached the code.
Please give me some solution.
Regards,
Ram
----------------------------------------------
/*
* speech.c
*
* ============================================================================
* Copyright (c) Texas Instruments Inc 2005
*
* Use of this software is controlled by the terms and conditions found in the
* license agreement under which this software has been supplied or provided.
* ============================================================================
*/
/* 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;
}
----------------------------------------------
/*
* speech.c
*
* ============================================================================
* Copyright (c) Texas Instruments Inc 2005
*
* Use of this software is controlled by the terms and conditions found in the
* license agreement under which this software has been supplied or provided.
* ============================================================================
*/
/* 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;
}
----------------------------------------------
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source