Skip to main content
misterstarshine
Associate III
September 26, 2016
Question

Can audio input and audio output be used with the same DMA audio buffer?

  • September 26, 2016
  • 3 replies
  • 909 views
Posted on September 26, 2016 at 21:00

Hi.

I seem to be unable to post replies to threads in this forum. A proxy-error page appears and I'm not using a proxy server. Sometimes a ''CAS/login'' error appears.

I'd like to use the STM32F746G Discovery as a DSP effect unit and wonder if it is possible to get around the limitation that the BSP_AUDIO_IN_OUT_Init function only is compatible with the on board microphone due to shared timeframes. It should be possible to use the same DMA audio buffer to both read the line-in input and to transmit it to the headphone jack. In order to do this I guess it would be necessary to use the same IRQ timing for both input and output. This is the smart way of doing DSP.

I can only output data and at the moment I use the DMA transfer callback routine to prepare the new output buffer. In fact it is required to use the DMA half transfer complete for the other half in order not to mess up the buffer data. It took me long time to figure this out. It would've been so much easier if the examples provided would've had minimalistic examples together with the more advanced applications. An example that just passes audio from line-in to headphone jack with maybe a simple amplitude change would've been very pedagogical in this context. Another simple waveform output example would've been very nice too. If I get this to work I might provide these myself.
    This topic has been closed for replies.

    3 replies

    Tesla DeLorean
    Guru
    September 26, 2016
    Posted on September 26, 2016 at 21:20

    Use ''Sign in to forum'' on the right pane and then Reply, it has been broken for months.

    You could use the same buffer, you'd like want to split it in two, having DMA work on opposing halves. You'd perhaps want to use the double-buffering scheme, or the HT/TC signals.

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    misterstarshine
    Associate III
    September 26, 2016
    Posted on September 26, 2016 at 23:44

    I'm already using two halves of the buffer when outputting the audio. Otherwise the audio will be affected by the updating process in the callback routine. This is how i did it for outputting a sine wave on the left channel and a triangle on the right channel.

    #define BUFLEN 128
    #define FREQ 11650000
    uint32_t samplecounter = 0;
    // the function ''readinterpolated'' outputs the waveform amplitude. The input phase is given as a uint32_t.
    void
    BSP_AUDIO_OUT_HalfTransfer_CallBack()
    {
    // update first half of buffer
    for
    (
    int
    i=0; i<BUFLEN/2; i++)
    {
    // left channel 
    buffer[i*2] = readinterpolated(samplecounter*FREQ, sindata)*32000.0f;
    // right channel
    buffer[i*2+1] = readinterpolated(samplecounter*FREQ, triangledata)*32000.0f;
    samplecounter++;
    }
    }
    void
    BSP_AUDIO_OUT_TransferComplete_CallBack()
    {
    // update second part of buffer
    for
    (
    int
    i=BUFLEN/2; i<BUFLEN; i++)
    {
    // left channel
    buffer[i*2] = readinterpolated(samplecounter*FREQ, sindata)*32000.0f;
    // right channel
    buffer[i*2+1] = readinterpolated(samplecounter*FREQ, triangledata)*32000.0f;
    samplecounter++;
    }
    }

    However when initializing the BSP_AUDIO_IN_Init and BSP_AUDIO_OUT_Init separately it seems like the data written to the buffer from the input jack is out of sync with the updating of the output buffer. One could of course have the input to a separate circular buffer and fetch that data from the output buffer but I see no reason why such a workaround should be needed. Edit: I forgot to mention that I want to be able to superimpose the incoming audio from line-in to some generated waveform such as the example above.
    misterstarshine
    Associate III
    September 27, 2016
    Posted on September 28, 2016 at 01:12

    Btw is it possible to input stereo audio from the blue line-in jack? In the audio library it seems like I must choose between INPUT_DEVICE_INPUT_LINE_1 or

    INPUT_DEVICE_INPUT_LINE_2 but I have no idea how to combine them. It did not work to just combine them by a ''binary-or'' operation.