--- sourceforge.net/trunk/rdesktop/rdpsnd.c 2008/01/18 15:11:57 1427 +++ sourceforge.net/trunk/rdesktop/rdpsnd.c 2008/02/08 10:34:53 1430 @@ -59,6 +59,7 @@ static RD_WAVEFORMATEX rec_formats[MAX_FORMATS]; static unsigned int rec_format_count; +static unsigned int rec_current_format; unsigned int queue_hi, queue_lo, queue_pending; struct audio_packet packet_queue[MAX_QUEUE]; @@ -153,7 +154,7 @@ void rdpsnd_record(const void *data, unsigned int size) { - uint32 remain; + uint32 remain, chunk; assert(rec_device_open); @@ -162,19 +163,25 @@ remain = sizeof(record_buffer) - record_buffer_size; if (size >= remain) - { - memcpy(record_buffer + record_buffer_size, data, remain); - record_buffer_size += remain; - rdpsnd_flush_record(); - data = (const char *) data + remain; - size -= remain; - } + chunk = remain; else - { - memcpy(record_buffer + record_buffer_size, data, size); - record_buffer_size += size; - size = 0; - } + chunk = size; + + memcpy(record_buffer + record_buffer_size, data, chunk); + +#ifdef B_ENDIAN + if (current_driver->need_byteswap_on_be) + rdpsnd_dsp_swapbytes(record_buffer + record_buffer_size, + chunk, &rec_formats[rec_current_format]); +#endif + + record_buffer_size += chunk; + + data = (const char *) data + chunk; + size -= chunk; + + if (record_buffer_size == sizeof(record_buffer)) + rdpsnd_flush_record(); } } @@ -513,6 +520,7 @@ current_driver->wave_in_close(); break; } + rec_current_format = format; rec_device_open = True; break; case RDPSND_REC_STOP: