954,504 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Writing PCM as raw data in C/C++ in Windows

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!

fluidDelusions
Newbie Poster
14 posts since Jul 2005
Reputation Points: 10
Solved Threads: 0
 

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?

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 
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[i]),2) and this will work fine. Again, it doesn't work in windows. Why?

fluidDelusions
Newbie Poster
14 posts since Jul 2005
Reputation Points: 10
Solved Threads: 0
 

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

fluidDelusions
Newbie Poster
14 posts since Jul 2005
Reputation Points: 10
Solved Threads: 0
 

> 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

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 

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

fluidDelusions
Newbie Poster
14 posts since Jul 2005
Reputation Points: 10
Solved Threads: 0
 

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

ims
Newbie Poster
1 post since Apr 2008
Reputation Points: 10
Solved Threads: 0
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You