|  | @@ -119,8 +119,16 @@ static int read_mp4_header(void) {
 | 
	
		
			
				|  |  |  		// extract audio config from within alac
 | 
	
		
			
				|  |  |  		if (!strcmp(type, "alac") && bytes > len) {
 | 
	
		
			
				|  |  |  			u8_t *ptr = streambuf->readp + 36;
 | 
	
		
			
				|  |  | -			l->decoder = alac_create_decoder(len - 36, ptr, &l->sample_size, &l->sample_rate, &l->channels);
 | 
	
		
			
				|  |  | -			l->play = l->trak;
 | 
	
		
			
				|  |  | +			unsigned int block_size;
 | 
	
		
			
				|  |  | +			l->decoder = alac_create_decoder(len - 36, ptr, &l->sample_size, &l->sample_rate, &l->channels, &block_size);
 | 
	
		
			
				|  |  | +			l->play = l->trak;			
 | 
	
		
			
				|  |  | +			l->writebuf = malloc(block_size + 256);
 | 
	
		
			
				|  |  | +			if (!l->writebuf) {
 | 
	
		
			
				|  |  | +				LOG_ERROR("cannot allocate write buffer for %u bytes", block_size);
 | 
	
		
			
				|  |  | +				return -1;
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				LOG_INFO("write buffer of %u bytes", block_size);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		// extract the total number of samples from stts
 | 
	
	
		
			
				|  | @@ -510,12 +518,11 @@ static decode_state alac_decode(void) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void alac_open(u8_t size, u8_t rate, u8_t chan, u8_t endianness) {
 | 
	
		
			
				|  |  |  	if (l->decoder)	alac_delete_decoder(l->decoder);
 | 
	
		
			
				|  |  | -	else l->writebuf = malloc(BLOCK_SIZE * 2);
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | +	if (l->writebuf) free(l->writebuf);
 | 
	
		
			
				|  |  |  	if (l->chunkinfo) free(l->chunkinfo);
 | 
	
		
			
				|  |  |  	if (l->block_size) free(l->block_size);
 | 
	
		
			
				|  |  |  	if (l->stsc) free(l->stsc);
 | 
	
		
			
				|  |  | -	l->decoder = l->chunkinfo = l->stsc = l->block_size = NULL;
 | 
	
		
			
				|  |  | +	l->writebuf = l->decoder = l->chunkinfo = l->stsc = l->block_size = NULL;
 | 
	
		
			
				|  |  |  	l->skip = 0;
 | 
	
		
			
				|  |  |  	l->samples = l->sttssamples = 0;
 | 
	
		
			
				|  |  |  	l->empty = false;
 | 
	
	
		
			
				|  | @@ -524,11 +531,11 @@ static void alac_open(u8_t size, u8_t rate, u8_t chan, u8_t endianness) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void alac_close(void) {
 | 
	
		
			
				|  |  |  	if (l->decoder) alac_delete_decoder(l->decoder);
 | 
	
		
			
				|  |  | +	if (l->writebuf) free(l->writebuf);	
 | 
	
		
			
				|  |  |  	if (l->chunkinfo) free(l->chunkinfo);
 | 
	
		
			
				|  |  |  	if (l->block_size) free(l->block_size);
 | 
	
		
			
				|  |  |  	if (l->stsc) free(l->stsc);
 | 
	
		
			
				|  |  | -	l->decoder = l->chunkinfo = l->stsc = l->block_size = NULL;
 | 
	
		
			
				|  |  | -	free(l->writebuf);
 | 
	
		
			
				|  |  | +	l->writebuf = l->decoder = l->chunkinfo = l->stsc = l->block_size = NULL;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  struct codec *register_alac(void) {
 | 
	
	
		
			
				|  | @@ -547,7 +554,7 @@ struct codec *register_alac(void) {
 | 
	
		
			
				|  |  |  		return NULL;
 | 
	
		
			
				|  |  |  	}	
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  | -	l->decoder = l->chunkinfo = l->stsc = l->block_size = NULL;
 | 
	
		
			
				|  |  | +	l->writebuf = l->decoder = l->chunkinfo = l->stsc = l->block_size = NULL;
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  |  	LOG_INFO("using alac to decode alc");
 | 
	
		
			
				|  |  |  	return &ret;
 |