Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 45fbfa93 authored by Amit Shekhar's avatar Amit Shekhar
Browse files

hal: Fix alignement of of buffer sent to DSP

Currently, ALIGN macro can align properly only if the buffer size
is a power of 2.
To have same PCM samples for all channels, the buffer size requires to
be multiple of (number of channels * bytes per sample).
For writes to succeed, the buffer must be written at address which is
multiple of 32.
Alignment of 96 satsfies both of the above requirements.

Change-Id: I5ab33ef198b5b8f18ae9f09c4361e5cff84e700e
CRs-Fixed: 795936
parent b58ff9b9
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -79,7 +79,8 @@
#define MIN_COMPRESS_PASSTHROUGH_FRAGMENT_SIZE (2 * 1024)
#define MAX_COMPRESS_PASSTHROUGH_FRAGMENT_SIZE (8 * 1024)

#define ALIGN( num, to ) (((num) + (to-1)) & (~(to-1)))
#define DIV_ROUND_UP(x, y) (((x) + (y) - 1)/(y))
#define ALIGN(x, y) ((y) * DIV_ROUND_UP((x), (y)))
/*
 * This file will have a maximum of 38 bytes:
 *
@@ -2935,8 +2936,11 @@ uint32_t platform_get_pcm_offload_buffer_size(audio_offload_info_t* info)
                     * info->sample_rate
                     * (bits_per_sample >> 3)
                     * popcount(info->channel_mask))/1000;
    // align with LCM of 2, 4, 6, 8
    fragment_size = ALIGN( fragment_size, 24 );
    // To have same PCM samples for all channels, the buffer size requires to
    // be multiple of (number of channels * bytes per sample)
    // For writes to succeed, the buffer must be written at address which is multiple of 32
    // Alignment of 96 satsfies both of the above requirements
    fragment_size = ALIGN(fragment_size, 96);
    if(fragment_size < MIN_PCM_OFFLOAD_FRAGMENT_SIZE)
        fragment_size = MIN_PCM_OFFLOAD_FRAGMENT_SIZE;
    else if(fragment_size > MAX_PCM_OFFLOAD_FRAGMENT_SIZE)