void * APR_THREAD_FUNC sync_dir(apr_thread_t* thread, void* ptr){ int files_synced = 0; int status; apr_status_t rv; const char* dbd_error; List* file_list; music_file* song; dir_sync_thread_t* dir_sync = (dir_sync_thread_t*) ptr; apr_pool_t* pool; db_config_t* db_config = dir_sync->db_config; char error_message[256]; //Create sub pool used for sync rv = apr_pool_create_ex(&pool, dir_sync->pool, NULL, NULL); if(rv != APR_SUCCESS){ error_messages_add(dir_sync->error_messages, ERROR ,"Memory Pool Error", apr_strerror(rv, error_message, sizeof(error_message))); return 0; } file_list = apr_pcalloc(pool, sizeof(List)); dir_sync->dir->stats->num_files = apr_pcalloc(pool, sizeof(int)); if(db_config->connected != 1){ error_messages_add(dir_sync->error_messages, ERROR, "Database not connected","ERROR ERROR"); return 0; } count_table_rows(); read_dir(pool, file_list, dir_sync->dir->path, dir_sync->dir->stats->num_files, dir_sync->error_messages); if ((file_list == NULL || dir_sync->dir->stats->num_files == NULL )&& (*dir_sync->dir->stats->num_files ) > 0 ){ error_messages_add(dir_sync->error_messages, ERROR, "Killing Sync Thread", ""); return 0; } status = apr_dbd_transaction_start(db_config->dbd_driver, pool, db_config->dbd_handle,&(db_config->transaction)); if(status != 0){ dbd_error = apr_dbd_error(db_config->dbd_driver, db_config->dbd_handle, status); error_messages_add(dir_sync->error_messages,ERROR, "Database error start transaction", dbd_error); return 0; } while(file_list->file.path){ song = apr_pcalloc(pool, sizeof(music_file)); song->file = &(file_list->file); switch(song->file->type){ #ifdef WITH_FLAC case FLAC:{ status = read_flac_level1(pool, song); if (status == 0){ song->file->type_string = "flac"; } break; } #endif #ifdef WITH_OGG case OGG:{ status = read_ogg(pool, song); if (status == 0){ song->file->type_string = "ogg"; } break; } #endif #ifdef WITH_MP3 case MP3:{ status = read_id3(pool,song); if (status == 0){ song->file->type_string = "mp3"; } break; } #endif default:{ status = -1; break; } } if (status == 0 && song){ //We have song get musicbrainz ids //status = get_musicbrainz_release_id(pool, song, dir_sync->error_messages); //Update or Insert song if (db_config->connected == 1){ status = sync_song(pool, db_config, song); if (status != 0){ error_messages_add(dir_sync->error_messages, ERROR, apr_psprintf(pool,"Failed to sync song:"), apr_psprintf(pool, "(%d) Song title: %s Song artist: %s song album:%s song file path: %s",status, song->title, song->artist, song->album, song->file->path)); } }else{ //Lost connection kill thread error_messages_add(dir_sync->error_messages, ERROR, "Failed to sync song:", "Lost connection to database"); return 0; } } //Calculate the percent of files synchronized dir_sync->dir->stats->sync_progress =(float) files_synced*100 / (*(dir_sync->dir->stats->num_files) - 1); dir_sync->dir->stats->files_scanned = files_synced; files_synced++; file_list = file_list->next; } status = apr_dbd_transaction_end(db_config->dbd_driver, pool, db_config->transaction); if(status != 0){ dbd_error = apr_dbd_error(db_config->dbd_driver, db_config->dbd_handle, status); error_messages_add(dir_sync->error_messages, ERROR, "Database error couldn't end transaction",dbd_error); return 0; } apr_pool_clear(pool); return 0; }
static int dsf_read_header(AVFormatContext *s) { DSFContext *dsf = s->priv_data; AVIOContext *pb = s->pb; AVStream *st; uint64_t id3pos; unsigned int channel_type; avio_skip(pb, 4); if (avio_rl64(pb) != 28) return AVERROR_INVALIDDATA; /* create primary stream before any id3 coverart streams */ st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); avio_skip(pb, 8); id3pos = avio_rl64(pb); if (pb->seekable) { read_id3(s, id3pos); avio_seek(pb, 28, SEEK_SET); } /* fmt chunk */ if (avio_rl32(pb) != MKTAG('f', 'm', 't', ' ') || avio_rl64(pb) != 52) return AVERROR_INVALIDDATA; if (avio_rl32(pb) != 1) { avpriv_request_sample(s, "unknown format version"); return AVERROR_INVALIDDATA; } if (avio_rl32(pb)) { avpriv_request_sample(s, "unknown format id"); return AVERROR_INVALIDDATA; } channel_type = avio_rl32(pb); if (channel_type < FF_ARRAY_ELEMS(dsf_channel_layout)) st->codecpar->channel_layout = dsf_channel_layout[channel_type]; if (!st->codecpar->channel_layout) avpriv_request_sample(s, "channel type %i", channel_type); st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; st->codecpar->channels = avio_rl32(pb); st->codecpar->sample_rate = avio_rl32(pb) / 8; if (st->codecpar->channels <= 0) return AVERROR_INVALIDDATA; switch(avio_rl32(pb)) { case 1: st->codecpar->codec_id = AV_CODEC_ID_DSD_LSBF_PLANAR; break; case 8: st->codecpar->codec_id = AV_CODEC_ID_DSD_MSBF_PLANAR; break; default: avpriv_request_sample(s, "unknown most significant bit"); return AVERROR_INVALIDDATA; } avio_skip(pb, 8); st->codecpar->block_align = avio_rl32(pb); if (st->codecpar->block_align > INT_MAX / st->codecpar->channels) { avpriv_request_sample(s, "block_align overflow"); return AVERROR_INVALIDDATA; } st->codecpar->block_align *= st->codecpar->channels; st->codecpar->bit_rate = st->codecpar->channels * st->codecpar->sample_rate * 8LL; avio_skip(pb, 4); /* data chunk */ dsf->data_end = avio_tell(pb); if (avio_rl32(pb) != MKTAG('d', 'a', 't', 'a')) return AVERROR_INVALIDDATA; dsf->data_end += avio_rl64(pb); return 0; }