Problems with manipulating bytes in a NSMutableData - Wave Header info
<p>I am trying to manipulate a wave file header.  I have loaded the file into a NSMutableData and am trying to change the wav file header info.  My problem is that on the line:</p>

<pre><code>[maindata replaceBytesInRange:range withBytes:((UInt32 *)tfSC1Length)];
</code></pre>

<p>I am receiving a EXC_BAD_ACCESS error.  Can't understand why.  Any ideas?</p>

<p>The code I am using is as follows:</p>

<pre><code>// calculate total file length (minus 8 for the header), chunk size, number of channels, sample rate and bits per sample
int tfLength        = ([maindata length] - 8);
int tfChannels      = 1;   // mono
int tfSampleRate    = 44100;
int tfDataLength    = ([maindata length] - 44);
int tfBitsPerSample = 16;

int tfSC1Length     = 16;
int tfAudioFormat   = 1;

//we are rebuilding the header for the wave files...

// chunk identifier
((char *)[maindata mutableBytes])[0] = 'R';
((char *)[maindata mutableBytes])[1] = 'I';
((char *)[maindata mutableBytes])[2] = 'F';
((char *)[maindata mutableBytes])[3] = 'F';

// size (less 8 bytes)
NSRange range;
range.location = 4;
range.length = 4;
[maindata replaceBytesInRange:range withBytes:(UInt32 *)tfLength];

// the file format
((char *)[maindata mutableBytes])[8]  = 'W';
((char *)[maindata mutableBytes])[9]  = 'A';
((char *)[maindata mutableBytes])[10] = 'V';
((char *)[maindata mutableBytes])[11] = 'E';

// subchunk1 ID
((char *)[maindata mutableBytes])[12] = 'f';
((char *)[maindata mutableBytes])[13] = 'm';
((char *)[maindata mutableBytes])[14] = 't';
((char *)[maindata mutableBytes])[15] = ' ';

// subchunk length
range.location = 16;
range.length   = 4;
[maindata replaceBytesInRange:range withBytes:((UInt32 *)tfSC1Length)];

// audio format
range.location = 20;
range.length   = 2;
[maindata replaceBytesInRange:range withBytes:((UInt16 *)tfAudioFormat)];

// number of channels
range.location = 22;
range.length   = 2;
[maindata replaceBytesInRange:range withBytes:((UInt16 *)tfChannels)];

// sample rate
range.location = 24;
range.length   = 4;
[maindata replaceBytesInRange:range withBytes:((UInt32 *)tfSampleRate)];

// byte rate
range.location = 28;
range.length   = 4;
[maindata replaceBytesInRange:range withBytes:((UInt32 *)(tfSampleRate * ((tfBitsPerSample * tfChannels) / 8)))];

// block align
range.location = 32;
range.length   = 2;
[maindata replaceBytesInRange:range withBytes:((UInt16 *)((tfBitsPerSample * tfChannels) / 8))];

// bits per sample
range.location = 34;
range.length   = 2; 
[maindata replaceBytesInRange:range withBytes:((UInt16 *)tfBitsPerSample)];

// adjust the length field of the wave file...
((char *)[maindata mutableBytes])[36] = 'd';
((char *)[maindata mutableBytes])[37] = 'a';
((char *)[maindata mutableBytes])[38] = 't';
((char *)[maindata mutableBytes])[39] = 'a';

// length of the audio data
range.location = 40;
range.length   = 4;
[maindata replaceBytesInRange:range withBytes:(UInt32 *)tfDataLength];
</code></pre>
