Estoy modificando el Qt Salida de Audio de ejemplo de la siguiente manera:

  • Tengo acceso a un mezclador de audio API de terceros.
  • El método para leer los datos de este mezclador es void AudioMixer::ReadData(uint8_t *stream, uint32_t len);
  • La función que me estoy cambiando de salida de los datos en el ejemplo es el qint64 Generator::readData(char *data, qint64 len)

Si mi interpretación es correcta, yo debería ser capaz de operar el QIODevice en un modo de inserción mediante la invalidación de la Generator::readData método para llamar la AudioMixer::ReadData método y fundición de la uint8_t* utilizado por el AudioMixer a un char* para su uso con el QIODevice.

Żestoy en lo cierto al pensar que esto es de alguna manera posible? Si es así, ¿alguien puede asesorar sobre cómo hacer el reparto? Si no, se puede ofrecer una explicación sobre cómo la salida de la uint8_t* el uso de un QIODevice?

Aras de la exhaustividad, los métodos son:

void AudioMixer::ReadData(uint8_t *stream, uint32_t len)
{   
    if(buffer.GetMaximumReadSize() < len)
    {
        memset(stream, 0, len);
    }
    else
    {
        buffer.Read(stream, len);
    }
}

y

qint64 Generator::readData(char *data, qint64 len)
{
    qint64 total = 0;
    while (len - total > 0) {
        const qint64 chunk = qMin((m_buffer.size() - m_pos), len - total);
        memcpy(data + total, m_buffer.constData() + m_pos, chunk);
        m_pos = (m_pos + chunk) % m_buffer.size();
        total += chunk;

        //Need to call AudioMixer::readData in here
    }
    return total;
}
  • uint8_t *a; char *b = (char *)a;
  • Es realmente tan simple como eso? No hay problemas potenciales debido a un char es esencialmente firmado?
  • El signedness (en la falta de una mejor palabra) sólo debe ser relevante si se va a hacer bitshift operaciones. Si el desplazamiento a la derecha sin signo variables siempre estará lleno de 0s, firmado variables con unos o ceros en función del valor.

1 Comentario

  1. 6

    No hay ningún tipo nativo para representar un «byte» en C++, sólo char que está garantizado para contener exactamente un byte. Hay diferentes opiniones acerca de un tipo byte para representar datos binarios puros deberá estar firmado o no, por lo que algunos usan unsigned char (uint8_t) y otros usan el llano char. En el final, realmente no importa, ya que no suelen realizar arithmic operaciones sobre los datos binarios, pero acabo de leer y de interpretar.

    Por lo tanto, sólo se puede utilizar un tipo de cast para convertir entre binarios diferentes representaciones de datos. Ya que esto es C++, debe utilizar reinterpret_cast (en favor de los C-estilo de yesos):

    char* dst = reinterpret_cast<char*>(/* your uint8_t* expression */);

    Si se utiliza reinterpret_cast o C-estilo de moldes es, obviamente, en disputa. Bjarne Stroustrup, el creador de C++, sería sin duda defensor de reinterpret_cast, pero a los demás no les gusta, y eso está bien.

    • Dejar de empujar reinterpret_cast si es necesario o no. reinterp…. es un montón de escribir, y en este caso es totalmente equivalente a un viejo-bueno C cast. Hay casos en los que es realmente importante en tiempo de ejecución (es decir, vtable offsets) o ayuda a la seguridad de tipos (no intencional buggy tipo de fundición). Pero, en realidad, usted tiene que entender que en lugar de tener una regla tonta diciendo: – tipo más sólo porque se ve más a diferencia de C.
    • «debería usar» No deberías. «Tienes» que el uso más simple la solución correcta. Que es de estilo C emitidos en este caso.
    • reinterpret_cast está ahí por una razón, y muchas C++ directrices de codificación por ahí claramente que se debe preferir un estilo nuevo arroja sobre C-estilo de moldes. No sé por qué están haciendo tanto alboroto sobre esto aquí. Sí, es largo (Bjarne Stroustoup dijo que es «un feo notación para un feo operación»), pero vamos, no es que mucho del tipo.
    • para que quede claro: no era mi intención criticar a su comentario, sólo para responder a la pregunta. Si el uso de una C-o nuevo estilo de estilo de fundición aquí no es el punto. La respuesta a la pregunta es: sólo tiene que utilizar un tipo de fundición. No soy partidario de reinterpret_cast porque «se parece a C», pero porque es el C++-forma de hacerlo (Stroustrup, incluso, dijo que sería «como la prohibición de estilo C moldes» en resumen, si podía, consulte www2.research.att.com/~bs/devXinterview.html).

Dejar respuesta

Please enter your comment!
Please enter your name here