"Allan Juhl Krisensen" <All@nKristensen.dk> wrote
>
> Jeg er godt klar over at det ikke er god programmerings skik, men håber
man
> kan forsvare det fordi det er tids kritisk !!
Hvis du vil bruge data for hver kanal som en long (32 bit), er du vel nødt
til at kopiere de 24 bit som du har modtager og sætte de mest betydende 8
bit til 0.
> men hvis i hare beder
> løsnings for slag er jeg åben
>
Det man jo altid kan gøre, er at indkapsle "det grimme og implementerings
afhængige", så applikationen ikke bliver svinet til. Det kan gøres sikkert
og effektivt, f.eks.:
#include <mem.h>
class audio_data
{
public:
void l_msb(int value);
void l_lsb_r_msb(int value);
void r_msb(int value);
long left(void) const;
long right(void) const;
private:
void set_data(int value, size_t offset);
private:
// some constants
enum { LEFT_CHANNEL = 0,
RIGHT_CHANNEL = 1,
CHANNELS = 2,
BYTES_PR_CHANNEL = 3
};
char data[CHANNELS*BYTES_PR_CHANNEL];
};
inline void audio_data::set_data(int value, size_t offset)
{
memcpy(&data[offset], reinterpret_cast<char*>(&value), sizeof(value));
}
inline void audio_data::l_msb(int value)
{
set_data(value, 0);
}
inline void audio_data::l_lsb_r_msb(int value)
{
set_data(value, 2);
}
inline void audio_data::r_msb(int value)
{
set_data(value, 4);
}
inline long audio_data::left(void) const
{
long result;
memcpy(reinterpret_cast<char*>(&result)+1,
&data[LEFT_CHANNEL*BYTES_PR_CHANNEL], BYTES_PR_CHANNEL);
return result & 0xffffff;
}
inline long audio_data::right(void) const
{
long result;
memcpy(reinterpret_cast<char*>(&result)+1,
&data[RIGHT_CHANNEL*BYTES_PR_CHANNEL], BYTES_PR_CHANNEL);
return result & 0xffffff;
}
int receive_audio(void)
{
return 0; // dummy data
}
int main(int argc, char* argv[])
{
audio_data sound[1024];
// receive audio data
for(audio_data* s = sound; &sound[sizeof(sound)/sizeof(sound[0])] != s;
++s) {
s->l_msb (receive_audio());
s->l_lsb_r_msb(receive_audio());
s->r_msb (receive_audio());
}
}
Venlig hilsen
Mogens Hansen
|