976
#undef HAVE_FLAC_STREAM_ENCODER_H /* not yet... */
977
#undef HAVE_FLAC_STREAM_DECODER_H
979
#ifdef HAVE_FLAC_STREAM_ENCODER_H
980
FLAC__StreamEncoderWriteStatus flacStreamEncoderWriteCallback(
981
const FLAC__StreamEncoder *
983
const FLAC__byte _buffer[],
984
unsigned int/* _samples*/,
986
unsigned int/* _current_frame*/,
987
void * _client_data )
991
return( FLAC__STREAM_ENCODER_WRITE_STATUS_OK );
993
return( ( static_cast<QBuffer *>( _client_data )->write(
994
(const char *) _buffer, _bytes ) ==
996
FLAC__STREAM_ENCODER_WRITE_STATUS_OK :
997
FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR );
1001
void flacStreamEncoderMetadataCallback( const FLAC__StreamEncoder *,
1002
const FLAC__StreamMetadata * _metadata,
1003
void * _client_data )
1005
QBuffer * b = static_cast<QBuffer *>( _client_data );
1007
b->write( (const char *) _metadata, sizeof( *_metadata ) );
1013
QString sampleBuffer::toBase64( void ) const
1015
if( m_data == NULL || m_frames == 0 )
1019
#ifdef HAVE_FLAC_STREAM_ENCODER_H
1020
const Uint32 FRAMES_PER_BUF = 1152;
1022
FLAC__StreamEncoder * flac_enc = FLAC__stream_encoder_new();
1023
FLAC__stream_encoder_set_channels( flac_enc, DEFAULT_CHANNELS );
1024
FLAC__stream_encoder_set_blocksize( flac_enc, FRAMES_PER_BUF );
1025
/* FLAC__stream_encoder_set_do_exhaustive_model_search( flac_enc, TRUE );
1026
FLAC__stream_encoder_set_do_mid_side_stereo( flac_enc, TRUE );*/
1027
FLAC__stream_encoder_set_sample_rate( flac_enc,
1028
mixer::inst()->sampleRate() );
1031
ba_writer.open( QBuffer::WriteOnly );
1033
ba_writer.open( IO_WriteOnly );
1036
FLAC__stream_encoder_set_write_callback( flac_enc,
1037
flacStreamEncoderWriteCallback );
1038
FLAC__stream_encoder_set_metadata_callback( flac_enc,
1039
flacStreamEncoderMetadataCallback );
1040
FLAC__stream_encoder_set_client_data( flac_enc, &ba_writer );
1041
if( FLAC__stream_encoder_init( flac_enc ) != FLAC__STREAM_ENCODER_OK )
1043
printf( "error within FLAC__stream_encoder_init()!\n" );
1045
Uint32 frame_cnt = 0;
1046
while( frame_cnt < m_frames )
1048
Uint32 remaining = tMin<Uint32>( FRAMES_PER_BUF,
1049
m_frames - frame_cnt );
1050
FLAC__int32 buf[FRAMES_PER_BUF * DEFAULT_CHANNELS];
1051
for( Uint32 f = 0; f < remaining; ++f )
1053
for( Uint8 ch = 0; ch < DEFAULT_CHANNELS; ++ch )
1055
buf[f*DEFAULT_CHANNELS+ch] = (FLAC__int32)(
1056
mixer::clip( m_data[f+frame_cnt][ch] ) *
1057
OUTPUT_SAMPLE_MULTIPLIER );
1060
FLAC__stream_encoder_process_interleaved( flac_enc, buf,
1062
frame_cnt += remaining;
1064
FLAC__stream_encoder_finish( flac_enc );
1065
FLAC__stream_encoder_delete( flac_enc );
1066
printf("%d %d\n", frame_cnt, (int)ba_writer.size() );
1069
return( ba_writer.data().toBase64() );
1071
QByteArray ba = ba_writer.buffer();
1072
const Uint32 ssize = ba.size();
1073
const Uint8 * src = (const Uint8 *) ba.data();
1076
#else /* HAVE_FLAC_STREAM_ENCODER_H */
1079
return( QByteArray( (const char *) m_data, m_frames *
1080
sizeof( sampleFrame ) ).toBase64() );
1082
const Uint32 ssize = m_frames * sizeof( sampleFrame );
1083
const Uint8 * src = (const Uint8 *) m_data;
1086
#endif /* HAVE_FLAC_STREAM_ENCODER_H */
1090
// code mostly taken from
1091
// qt-x11-opensource-src-4.0.1/src/corelib/tools/qbytearray.cpp
1093
const char alphabet[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
1094
"ghijklmn" "opqrstuv" "wxyz0123" "456789+/";
1095
const char padchar = '=';
1098
const Uint32 dsize = ( ( ssize * 4 ) / 3 ) + 3;
1099
char * ptr = new char[dsize + 1];
1106
chunk |= Uint32( src[i++] ) << 16;
1113
chunk |= Uint32( src[i++] ) << 8;
1120
chunk |= Uint32( src[i++] );
1124
Uint32 j = ( chunk & 0x00fc0000 ) >> 18;
1125
Uint32 k = ( chunk & 0x0003f000 ) >> 12;
1126
Uint32 l = ( chunk & 0x00000fc0 ) >> 6;
1127
Uint32 m = ( chunk & 0x0000003f );
1128
*out++ = alphabet[j];
1129
*out++ = alphabet[k];
1136
*out++ = alphabet[l];
1144
*out++ = alphabet[m];
937
1158
void sampleBuffer::setAudioFile( const QString & _audio_file )
1179
#ifdef HAVE_FLAC_STREAM_DECODER_H
1181
struct flacStreamDecoderClientData
1183
QBuffer * read_buffer;
1184
QBuffer * write_buffer;
1189
FLAC__StreamDecoderReadStatus flacStreamDecoderReadCallback(
1190
const FLAC__StreamDecoder *
1192
FLAC__byte * _buffer,
1193
unsigned int * _bytes,
1194
void * _client_data )
1196
int res = static_cast<flacStreamDecoderClientData *>(
1197
_client_data )->read_buffer->read(
1198
(char *) _buffer, *_bytes );
1203
return( FLAC__STREAM_DECODER_READ_STATUS_CONTINUE );
1207
return( FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM );
1213
FLAC__StreamDecoderWriteStatus flacStreamDecoderWriteCallback(
1214
const FLAC__StreamDecoder *
1216
const FLAC__Frame * _frame,
1217
const FLAC__int32 * const _buffer[],
1218
void * _client_data )
1220
if( _frame->header.channels != 2 )
1222
printf( "channels != 2 in "
1223
"flacStreamDecoderWriteCallback()\n" );
1224
return( FLAC__STREAM_DECODER_WRITE_STATUS_ABORT );
1227
if( _frame->header.bits_per_sample != 16 )
1229
printf( "bits_per_sample != 16 in "
1230
"flacStreamDecoderWriteCallback()\n" );
1231
return( FLAC__STREAM_DECODER_WRITE_STATUS_ABORT );
1234
const Uint32 frames = _frame->header.blocksize;
1235
for( Uint32 frame = 0; frame < frames; ++frame )
1237
sampleFrame sframe = { _buffer[0][frame] /
1238
OUTPUT_SAMPLE_MULTIPLIER,
1240
OUTPUT_SAMPLE_MULTIPLIER
1242
static_cast<flacStreamDecoderClientData *>(
1243
_client_data )->write_buffer->write(
1244
(const char *) sframe, sizeof( sframe ) );
1246
return( FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE );
1250
void flacStreamDecoderMetadataCallback( const FLAC__StreamDecoder *,
1251
const FLAC__StreamMetadata *,
1252
void * /*_client_data*/ )
1254
printf("stream decoder metadata callback\n");
1255
/* QBuffer * b = static_cast<QBuffer *>( _client_data );
1257
b->write( (const char *) _metadata, sizeof( *_metadata ) );*/
1261
void flacStreamDecoderErrorCallback( const FLAC__StreamDecoder *,
1262
FLAC__StreamDecoderErrorStatus _status,
1263
void * /*_client_data*/ )
1265
printf("error callback! %d\n", _status);
1272
void sampleBuffer::loadFromBase64( const QString & _data )
1275
QByteArray orig_data = QByteArray::fromBase64( _data.toAscii() );
1277
const char * src = _data.ascii();
1278
csize ssize = _data.length();
1279
csize dsize = ( _data.length() * 3 ) / 4;
1280
char * dst = new char[dsize];
1282
// code mostly taken from
1283
// qt-x11-opensource-src-4.0.1/src/corelib/tools/qbytearray.cpp
1284
unsigned int buf = 0;
1288
for( csize i = 0; i < ssize; ++i )
1293
if( ch >= 'A' && ch <= 'Z' )
1297
else if( ch >= 'a' && ch <= 'z' )
1301
else if( ch >= '0' && ch <= '9' )
1305
else if( ch == '+' )
1309
else if( ch == '/' )
1320
buf = ( buf << 6 ) | (Uint32)d;
1325
dst[offset++] = buf >> nbits;
1326
buf &= ( 1 << nbits ) - 1;
1330
QByteArray orig_data;
1331
orig_data.setRawData( dst, dsize );
1333
#ifdef HAVE_FLAC_STREAM_DECODER_H
1336
QBuffer ba_reader( &orig_data );
1337
ba_reader.open( QBuffer::ReadOnly );
1339
QBuffer ba_reader( orig_data );
1340
ba_reader.open( IO_ReadOnly );
1345
ba_writer.open( QBuffer::WriteOnly );
1347
ba_writer.open( IO_WriteOnly );
1350
flacStreamDecoderClientData cdata = { &ba_reader, &ba_writer } ;
1352
FLAC__StreamDecoder * flac_dec = FLAC__stream_decoder_new();
1354
FLAC__stream_decoder_set_read_callback( flac_dec,
1355
flacStreamDecoderReadCallback );
1356
FLAC__stream_decoder_set_write_callback( flac_dec,
1357
flacStreamDecoderWriteCallback );
1358
FLAC__stream_decoder_set_error_callback( flac_dec,
1359
flacStreamDecoderErrorCallback );
1360
FLAC__stream_decoder_set_metadata_callback( flac_dec,
1361
flacStreamDecoderMetadataCallback );
1362
FLAC__stream_decoder_set_client_data( flac_dec, &cdata );
1364
FLAC__stream_decoder_init( flac_dec );
1366
FLAC__stream_decoder_process_until_end_of_stream( flac_dec );
1368
FLAC__stream_decoder_finish( flac_dec );
1369
FLAC__stream_decoder_delete( flac_dec );
1371
orig_data = ba_writer.buffer();
1372
printf("%d\n", (int) orig_data.size() );
1374
m_origFrames = orig_data.size() / sizeof( sampleFrame );
1375
delete[] m_origData;
1376
m_origData = new sampleFrame[m_origFrames];
1377
memcpy( m_origData, orig_data.data(), orig_data.size() );
959
1387
void sampleBuffer::setStartFrame( Uint32 _s )