Hello!
I'm having a very difficult time with this problem. What I'm trying to do is generate a sine wave for a specific frequency and output it as raw pcm data to a file.
The sine wave is generated as follows:

samples[i]=static_cast<int>(32767 * amplitude * sin(static_cast<double>(i)*scale) );

where scale = 2*PI/sample_rate.

And to write a specific sample in raw format, I'm first converting it to an array of char in little endian byte order, like this:

void writeInt(std::ofstream& out, int integer, int num_bytes)
{
	int y = (integer);
	for(int i=0; i<num_bytes; i++)
	{
		int x = y&255;
		out.put(x);
		y = y>>8;
	}
}

Now, this is fine in Linux (using gcc). I am able to play a smooth frequency. The problem is when I try to run the same code under Windows (compiled with mingw or bcc32), I get a very distorted sounding wave. Clearly, the data is not being written or converted properly. So to get right down to it, what is causing this difference between Linux and Windows? And, if at all possible, how do I do this the right way in Windows?
Thanks for your consideration!

Recommended Answers

All 6 Replies

Well did you open the file for output in binary mode?
Did you check the sizes of the file on the two different systems was the same?
Have you copied a file generated on your Linux box to the windows box, and tried to play that?

Well did you open the file for output in binary mode?
Did you check the sizes of the file on the two different systems was the same?
Have you copied a file generated on your Linux box to the windows box, and tried to play that?

Yes, yes, and yes. I can make a wave file out of the linux and the windows pcm data, and the linux sounds correct on both linux and windows. I can make a wave in windows and it sounds the same in windows and linux (scratchy and bad). I can make the raw data in windows, and use sox to convert that to a wave in linux, and it sounds the same on linux as it does windows.
The difference is happening at the conversion from integer to bytes, I'm almost sure of that. Another thing: in linux, you can just call ostream.write((char*)(&samples),2) and this will work fine. Again, it doesn't work in windows. Why?

Uh, heh heh. Problem solved. I wasn't opening the ofstream for binary output. Thanks Salem. I'm so ashamed...

> y = y>>8;
Right shift of negative numbers is implementation defined.
On some systems, the sign bit is propagated
11110000 would become 11111000

and on others zero is inserted.
11110000 would become 01111000

That might be true, but then I had tried using standard division, and it did the exact same thing...

Hi,
I am facing the same problem as fluidDelusions.
I can make a wave file out of the linux and the windows pcm data, and the linux sounds correct on both linux and windows. I can make a wave in windows and it sounds the same in windows and linux (scratchy and bad).
If a play the recordfile which is PCM data, 16 bit mono, rate 8000 using the API, it plays fine, bu when i add wave header to it, it becomes bad and scratchy. I am using the same code to write wavheader in Linux and there it works perfectly fine. What can be the problem?
I am in urgent need of the reply. Kindly reply As soon as possible.

Thanks
IMS

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.