STM32 : reset the I2S DMA address pointer
Ok so I might not have found a way of actually reset the DMA pointer without disabling the stream (yet) but I found more information, and a way of circumventing the problem.


When you use circular mode with pointer incrementation, the address of the data to be transferred is calculated from the DMA_SxNDTR register (which contains the remaining number of data to be sent) and the DMA_SxM0AR register (which contains the ase address for the DMA stream). The pointer is the base address offsetted by the size of the buffer minus the DMA_SxNDTR value. If you reset DMA_SxNDTR to the size of the data, you reset the pointer to the base address (from what I could understand, I could be wrong). However, you can't change the value of the register unless the stream is disabled. So to reset the pointer, you would have to disable the stream, reset DMA_SxNDTR and then reactivate the stream.
You could however read the DMA_SxNDTR register to know in which part of the buffer you are, so that you can refill only the other half. In that case, the peripheral would receive the remains of the old sound, then start reading the new sound safely.
A third possibility would be to read the DMA_SxNDTR and start refilling the buffer only when there's no data left to transfer. It adds in latency but avoids the old sound remains to be played.


The last solution would look like that : 

void HAL_GPIO_EXTI_Callback(uint16_t pin)
{
    if(pin == GPIO_PIN_13)
    {
        changeSound(&amp;sound);
        while(DMA1_Stream4-&gt;NDTR &gt;= 1);
        HAL_I2S_DMAPause(&amp;hi2s2);
        fillBuf(&amp;buf, &amp;sound);
        HAL_I2S_DMAResume(&amp;hi2s2);
    }
}


I haven't tried it yet so I can't be sure if it works or not, I'll update this answer as soon as I do.

Sources : 


sections 9.3 and 9.5 of the reference manual of the STM32F4
STM32F4's application note on the DMA controller