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.
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 usanunsigned char
(uint8_t
) y otros usan el llanochar
. 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):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 dereinterpret_cast
, pero a los demás no les gusta, y eso está bien.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.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).