pcm_dither: pass an "end" pointer instead of a sample count
This is easier and more efficient to loop on, because only two variables get modified (src and dest).
This commit is contained in:
		| @@ -72,10 +72,9 @@ pcm_dither_sample_24_to_16(int32_t sample, struct pcm_dither *dither) | |||||||
|  |  | ||||||
| void | void | ||||||
| pcm_dither_24_to_16(struct pcm_dither *dither, | pcm_dither_24_to_16(struct pcm_dither *dither, | ||||||
| 		    int16_t *dest, const int32_t *src, | 		    int16_t *dest, const int32_t *src, const int32_t *src_end) | ||||||
| 		    unsigned num_samples) |  | ||||||
| { | { | ||||||
| 	while (num_samples-- > 0) | 	while (src < src_end) | ||||||
| 		*dest++ = pcm_dither_sample_24_to_16(*src++, dither); | 		*dest++ = pcm_dither_sample_24_to_16(*src++, dither); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -87,9 +86,8 @@ pcm_dither_sample_32_to_16(int32_t sample, struct pcm_dither *dither) | |||||||
|  |  | ||||||
| void | void | ||||||
| pcm_dither_32_to_16(struct pcm_dither *dither, | pcm_dither_32_to_16(struct pcm_dither *dither, | ||||||
| 		    int16_t *dest, const int32_t *src, | 		    int16_t *dest, const int32_t *src, const int32_t *src_end) | ||||||
| 		    unsigned num_samples) |  | ||||||
| { | { | ||||||
| 	while (num_samples-- > 0) | 	while (src < src_end) | ||||||
| 		*dest++ = pcm_dither_sample_32_to_16(*src++, dither); | 		*dest++ = pcm_dither_sample_32_to_16(*src++, dither); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -36,12 +36,10 @@ pcm_dither_24_init(struct pcm_dither *dither) | |||||||
|  |  | ||||||
| void | void | ||||||
| pcm_dither_24_to_16(struct pcm_dither *dither, | pcm_dither_24_to_16(struct pcm_dither *dither, | ||||||
| 		    int16_t *dest, const int32_t *src, | 		    int16_t *dest, const int32_t *src, const int32_t *src_end); | ||||||
| 		    unsigned num_samples); |  | ||||||
|  |  | ||||||
| void | void | ||||||
| pcm_dither_32_to_16(struct pcm_dither *dither, | pcm_dither_32_to_16(struct pcm_dither *dither, | ||||||
| 		    int16_t *dest, const int32_t *src, | 		    int16_t *dest, const int32_t *src, const int32_t *src_end); | ||||||
| 		    unsigned num_samples); |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -35,18 +35,16 @@ pcm_convert_8_to_16(int16_t *out, const int8_t *in, | |||||||
|  |  | ||||||
| static void | static void | ||||||
| pcm_convert_24_to_16(struct pcm_dither *dither, | pcm_convert_24_to_16(struct pcm_dither *dither, | ||||||
| 		     int16_t *out, const int32_t *in, | 		     int16_t *out, const int32_t *in, const int32_t *in_end) | ||||||
| 		     unsigned num_samples) |  | ||||||
| { | { | ||||||
| 	pcm_dither_24_to_16(dither, out, in, num_samples); | 	pcm_dither_24_to_16(dither, out, in, in_end); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| pcm_convert_32_to_16(struct pcm_dither *dither, | pcm_convert_32_to_16(struct pcm_dither *dither, | ||||||
| 		     int16_t *out, const int32_t *in, | 		     int16_t *out, const int32_t *in, const int32_t *in_end) | ||||||
| 		     unsigned num_samples) |  | ||||||
| { | { | ||||||
| 	pcm_dither_32_to_16(dither, out, in, num_samples); | 	pcm_dither_32_to_16(dither, out, in, in_end); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int32_t * | static int32_t * | ||||||
| @@ -63,6 +61,7 @@ pcm_convert_to_16(struct pcm_buffer *buffer, struct pcm_dither *dither, | |||||||
| 		  enum sample_format src_format, const void *src, | 		  enum sample_format src_format, const void *src, | ||||||
| 		  size_t src_size, size_t *dest_size_r) | 		  size_t src_size, size_t *dest_size_r) | ||||||
| { | { | ||||||
|  | 	const void *src_end = (const char *)src + src_size; | ||||||
| 	unsigned num_samples; | 	unsigned num_samples; | ||||||
| 	int16_t *dest; | 	int16_t *dest; | ||||||
| 	int32_t *dest32; | 	int32_t *dest32; | ||||||
| @@ -95,7 +94,7 @@ pcm_convert_to_16(struct pcm_buffer *buffer, struct pcm_dither *dither, | |||||||
| 		/* convert to 16 bit in-place */ | 		/* convert to 16 bit in-place */ | ||||||
| 		*dest_size_r = num_samples * sizeof(*dest); | 		*dest_size_r = num_samples * sizeof(*dest); | ||||||
| 		pcm_convert_24_to_16(dither, dest, dest32, | 		pcm_convert_24_to_16(dither, dest, dest32, | ||||||
| 				     num_samples); | 				     dest32 + num_samples); | ||||||
| 		return dest; | 		return dest; | ||||||
|  |  | ||||||
| 	case SAMPLE_FORMAT_S24_P32: | 	case SAMPLE_FORMAT_S24_P32: | ||||||
| @@ -105,7 +104,7 @@ pcm_convert_to_16(struct pcm_buffer *buffer, struct pcm_dither *dither, | |||||||
|  |  | ||||||
| 		pcm_convert_24_to_16(dither, dest, | 		pcm_convert_24_to_16(dither, dest, | ||||||
| 				     (const int32_t *)src, | 				     (const int32_t *)src, | ||||||
| 				     num_samples); | 				     (const int32_t *)src_end); | ||||||
| 		return dest; | 		return dest; | ||||||
|  |  | ||||||
| 	case SAMPLE_FORMAT_S32: | 	case SAMPLE_FORMAT_S32: | ||||||
| @@ -115,7 +114,7 @@ pcm_convert_to_16(struct pcm_buffer *buffer, struct pcm_dither *dither, | |||||||
|  |  | ||||||
| 		pcm_convert_32_to_16(dither, dest, | 		pcm_convert_32_to_16(dither, dest, | ||||||
| 				     (const int32_t *)src, | 				     (const int32_t *)src, | ||||||
| 				     num_samples); | 				     (const int32_t *)src_end); | ||||||
| 		return dest; | 		return dest; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -48,7 +48,7 @@ test_pcm_dither_24(void) | |||||||
|  |  | ||||||
| 	int16_t dest[N]; | 	int16_t dest[N]; | ||||||
|  |  | ||||||
| 	pcm_dither_24_to_16(&dither, dest, src, N); | 	pcm_dither_24_to_16(&dither, dest, src, src + N); | ||||||
|  |  | ||||||
| 	for (unsigned i = 0; i < N; ++i) { | 	for (unsigned i = 0; i < N; ++i) { | ||||||
| 		g_assert_cmpint(dest[i], >=, (src[i] >> 8) - 8); | 		g_assert_cmpint(dest[i], >=, (src[i] >> 8) - 8); | ||||||
| @@ -70,7 +70,7 @@ test_pcm_dither_32(void) | |||||||
|  |  | ||||||
| 	int16_t dest[N]; | 	int16_t dest[N]; | ||||||
|  |  | ||||||
| 	pcm_dither_32_to_16(&dither, dest, src, N); | 	pcm_dither_32_to_16(&dither, dest, src, src + N); | ||||||
|  |  | ||||||
| 	for (unsigned i = 0; i < N; ++i) { | 	for (unsigned i = 0; i < N; ++i) { | ||||||
| 		g_assert_cmpint(dest[i], >=, (src[i] >> 16) - 8); | 		g_assert_cmpint(dest[i], >=, (src[i] >> 16) - 8); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann