diff --git a/veejay-current/configure.ac b/veejay-current/configure.ac index 2e0fcc8d..2f4c2bf1 100644 --- a/veejay-current/configure.ac +++ b/veejay-current/configure.ac @@ -1,12 +1,12 @@ dnl Process this file with autoconf to produce a configure script. dnl AC_INIT -AC_INIT([veejay],[0.9.18],[veejay-users@lists.sourceforge.net]) +AC_INIT([veejay],[0.9.19],[veejay-users@lists.sourceforge.net]) AC_PREREQ(2.57) AC_CONFIG_SRCDIR([veejay/veejay.c]) VEEJAY_MAJOR_VERSION=0 VEEJAY_MINOR_VERSION=9 -VEEJAY_MICRO_VERSION=18 +VEEJAY_MICRO_VERSION=19 VEEJAY_VERSION=$VEEJAY_MAJOR_VERSION.$VEEJAY_MINOR_VERSION.$VEEJAY_MICRO_VERSION VEEJAY_CODENAME="Veejay Classic - build $VEEJAY_MINOR_VERSION $VEEJAY_MICRO_VERSION" AC_CONFIG_HEADERS([config.h]) diff --git a/veejay-current/gveejay-reloaded/callback.c b/veejay-current/gveejay-reloaded/callback.c index 0f3ba905..c068ac99 100644 --- a/veejay-current/gveejay-reloaded/callback.c +++ b/veejay-current/gveejay-reloaded/callback.c @@ -862,9 +862,6 @@ void on_stream_recordstart_clicked(GtkWidget *widget, gpointer user_data) GtkComboBox *combo = GTK_COMBO_BOX( GTK_WIDGET(glade_xml_get_widget(info->main_window,"combo_streamcodec"))); gchar *format = (gchar*)gtk_combo_box_get_active_text(combo) ; - if(nframes <= 0) - return; - if(format != NULL) { multi_vims( VIMS_RECORD_DATAFORMAT,"%s", @@ -907,9 +904,6 @@ void on_button_sample_recordstart_clicked(GtkWidget *widget, gpointer user_data) gchar *format = (gchar*) gtk_combo_box_get_active_text(combo); gint nframes = info->uc.sample_rec_duration; - if(nframes <= 0) - return; - gsize br=0; gsize bw=0; gchar *utftext = (gchar*) get_text( "entry_samplename"); gchar *text = (utftext != NULL ? g_locale_from_utf8( utftext, -1, &br, &bw,NULL) : NULL); @@ -956,7 +950,7 @@ void on_button_sample_recordstop_clicked(GtkWidget *widget, gpointer user_data) static int sample_calctime() { - gint n_frames = get_nums( "spin_sampleduration"); +/* gint n_frames = get_nums( "spin_sampleduration"); if( is_button_toggled( "sample_mulloop" ) ) { if(n_frames > 0) @@ -965,7 +959,11 @@ static int sample_calctime() if( info->status_tokens[SAMPLE_LOOP] == 2 ) n_frames *= 2; } - } + }*/ + + int n_frames = info->status_tokens[SAMPLE_END] - info->status_tokens[SAMPLE_START]; + if( info->status_tokens[SAMPLE_LOOP] == 2 ) + n_frames *= 2; return n_frames; } diff --git a/veejay-current/gveejay-reloaded/vj-api.c b/veejay-current/gveejay-reloaded/vj-api.c index 902e3ab2..afdfc80d 100644 --- a/veejay-current/gveejay-reloaded/vj-api.c +++ b/veejay-current/gveejay-reloaded/vj-api.c @@ -2985,6 +2985,8 @@ static void update_current_slot(int *history, int pm, int last_pm) update_spin_range( "spin_text_start", 0, n_frames ,0); update_spin_range( "spin_text_end", 0, n_frames,n_frames ); + info->uc.sample_rec_duration = n_frames; + info->uc.reload_hint[HINT_KF] = 1; } } @@ -5235,6 +5237,16 @@ static void load_editlist_info() update_label_i( "label_el_arate", (int)rate, 0); update_label_i( "label_el_achans", values[7], 0); update_label_i( "label_el_abits", values[5], 0); + + if( rate == 0 ) + { + enable_widget( "vjframerate" ); + } + else + { + disable_widget( "vjframerate"); + } + /* if( rate == 0 ) { @@ -5397,7 +5409,7 @@ static gboolean update_sample_record_timeout(gpointer data) gdouble cf = info->status_tokens[STREAM_RECORDED]; gdouble fraction = cf / tf; - + if(!info->status_tokens[STREAM_RECORDING] ) { gtk_progress_bar_set_fraction( GTK_PROGRESS_BAR(w), 0.0); diff --git a/veejay-current/libel/avilib.c b/veejay-current/libel/avilib.c index f643db95..dc410543 100644 --- a/veejay-current/libel/avilib.c +++ b/veejay-current/libel/avilib.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "avilib.h" #define INFO_LIST @@ -455,16 +456,18 @@ static int avi_add_odml_index_entry(avi_t *AVI, unsigned char *tag, long flags, if (AVI->video_superindex && (off_t)(AVI->pos+towrite) > (off_t)((off_t)NEW_RIFF_THRES*AVI->video_superindex->nEntriesInUse)) { - fprintf(stderr, "Adding a new RIFF chunk: %d\n", AVI->video_superindex->nEntriesInUse); +// fprintf(stderr, "Adding a new RIFF chunk: %d\n", AVI->video_superindex->nEntriesInUse); + veejay_msg( 2, "Adding a new RIFF chunk: %d", AVI->video_superindex->nEntriesInUse ); // rotate ALL indices AVI->video_superindex->nEntriesInUse++; cur_std_idx = AVI->video_superindex->nEntriesInUse-1; if (AVI->video_superindex->nEntriesInUse > NR_IXNN_CHUNKS) { - fprintf (stderr, "Internal error in avilib - redefine NR_IXNN_CHUNKS\n"); - fprintf (stderr, "[avilib dump] cur_std_idx=%d NR_IXNN_CHUNKS=%d" - "POS=%lld towrite=%lld\n", + veejay_msg(0, "Internal error in avilib - redefine NR_IXNN_CHUNKS (needed=%d, current=%d)", + AVI->video_superindex->nEntriesInUse, NR_IXNN_CHUNKS); + veejay_msg(0, "[avilib dump] cur_std_idx=%d NR_IXNN_CHUNKS=%d" + "POS=%lld towrite=%lld", cur_std_idx,NR_IXNN_CHUNKS, AVI->pos, towrite); return -1; } @@ -576,8 +579,6 @@ static int avi_add_index_entry(avi_t *AVI, unsigned char *tag, long flags, unsig /* Add index entry */ - // fprintf(stderr, "INDEX %s %ld %lu %lu\n", tag, flags, pos, len); - veejay_memcpy(AVI->idx[AVI->n_idx],tag,4); long2str(AVI->idx[AVI->n_idx]+ 4,flags); long2str(AVI->idx[AVI->n_idx]+ 8, pos); @@ -694,19 +695,19 @@ void AVI_set_video(avi_t *AVI, int width, int height, double fps, char *compress avi_update_header(AVI); } -void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format) +int AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format) { /* may only be called if file is open for writing */ - if(AVI->mode==AVI_MODE_READ) return; + if(AVI->mode==AVI_MODE_READ) return -1; //inc audio tracks AVI->aptr=AVI->anum; ++AVI->anum; if(AVI->anum > AVI_MAX_TRACKS) { - fprintf(stderr, "error - only %d audio tracks supported\n", AVI_MAX_TRACKS); - exit(1); + veejay_msg(0, "error - only %d audio tracks supported\n", AVI_MAX_TRACKS); + return -1; } AVI->track[AVI->aptr].a_chans = channels; @@ -715,7 +716,7 @@ void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format) AVI->track[AVI->aptr].a_fmt = format; // AVI->track[AVI->aptr].mp3rate = mp3rate; - avi_update_header(AVI); + return avi_update_header(AVI); } #define OUT4CC(s) \ @@ -962,8 +963,9 @@ int avi_update_header(avi_t *AVI) if(njunk<=0) { - fprintf(stderr,"AVI_close_output_file: # of header bytes too small\n"); - exit(1); + veejay_msg(0, "%s: # of header bytes too small",__FUNCTION__); + veejay_msg(0, "Somebody has played with HEADERBYTES of this AVI without knowing what (s)he did"); + return -1; } OUT4CC ("JUNK"); @@ -3358,7 +3360,8 @@ long AVI_read_audio(avi_t *AVI, char *audbuf, long bytes) lseek(AVI->fdes, pos, SEEK_SET); if ( (ret = avi_read(AVI->fdes,audbuf+nr,todo)) != todo) { - fprintf(stderr, "XXX pos = %lld, ret = %lld, todo = %ld\n", pos, ret, todo); +// fprintf(stderr, "XXX pos = %lld, ret = %lld, todo = %ld\n", pos, ret, todo); + veejay_msg(0, "No audio data at position %ld!"); AVI_errno = AVI_ERR_READ; return -1; } diff --git a/veejay-current/libel/avilib.h b/veejay-current/libel/avilib.h index 6cac81b6..0a562e48 100644 --- a/veejay-current/libel/avilib.h +++ b/veejay-current/libel/avilib.h @@ -324,7 +324,7 @@ typedef struct avi_t* AVI_open_output_file(char * filename); void AVI_set_video(avi_t *AVI, int width, int height, double fps, char *compressor); -void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format); +int AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format); int AVI_write_frame(avi_t *AVI, char *data, long bytes); int AVI_dup_frame(avi_t *AVI); int AVI_write_audio(avi_t *AVI, char *data, long bytes); diff --git a/veejay-current/libel/lav_io.c b/veejay-current/libel/lav_io.c index cabb7e81..f3ddae75 100644 --- a/veejay-current/libel/lav_io.c +++ b/veejay-current/libel/lav_io.c @@ -327,6 +327,10 @@ lav_file_t *lav_open_output_file(char *filename, char format, lav_fd->bps = (asize*achans+7)/8; lav_fd->is_MJPG = 1; lav_fd->MJPG_chroma = _lav_io_default_chroma; + + char fourcc[16]; + + int is_avi = 1; switch(format) { @@ -334,96 +338,66 @@ lav_file_t *lav_open_output_file(char *filename, char format, case 'A': /* Open AVI output file */ veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI MJPEG"); - lav_fd->avi_fd = AVI_open_output_file(filename); + sprintf(fourcc, "MJPG" ); + break; + case 'L': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI LZO"); + sprintf(fourcc, "MLZO" ); + break; + case 'Y': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI IYUV"); + sprintf(fourcc, "IYUV" ); + break; + case 'P': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI YV16"); + sprintf(fourcc, "YV16"); + break; + case 'D': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI DIV3"); + sprintf(fourcc, "DIV3"); + break; + case 'M': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI MP4V"); + sprintf(fourcc,"MP4V"); + break; + case 'b': + case 'd': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI DVSD"); + sprintf(fourcc, "DVSD"); + break; + + case 'q': + case 'Q': + veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in Quicktime MJPA/JPEG"); + is_avi = 0; + break; + } + + if( is_avi ) + { + lav_fd->avi_fd = AVI_open_output_file(filename); if(!lav_fd->avi_fd) { free(lav_fd); return NULL; } - AVI_set_video(lav_fd->avi_fd, width, height, fps, "MJPG"); + AVI_set_video(lav_fd->avi_fd, width, height, fps, fourcc ); if (asize) - AVI_set_audio(lav_fd->avi_fd, achans, arate, asize, WAVE_FORMAT_PCM); + { + if(AVI_set_audio(lav_fd->avi_fd, achans, arate, asize, WAVE_FORMAT_PCM)==-1) + { + veejay_msg(0, "Too many channels or invalid AVI file"); + lav_close( lav_fd ); + return NULL; + } + } return lav_fd; - case 'L': - veejay_msg(VEEJAY_MSG_DEBUG,"\tWriting output file in AVI LZO"); - lav_fd->avi_fd=AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd, width,height,fps, "mlzo"); - if(asize) - AVI_set_audio(lav_fd->avi_fd, achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'Y': - veejay_msg(VEEJAY_MSG_DEBUG,"\tWriting output file in AVI IYUV"); - lav_fd->avi_fd = AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd, width,height,fps, "iyuv"); - if(asize) - AVI_set_audio(lav_fd->avi_fd, achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'P': - veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI yv16"); - lav_fd->avi_fd = AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd, width,height,fps, "yv16"); - if(asize) - AVI_set_audio(lav_fd->avi_fd, achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'D': - veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI div3"); - lav_fd->avi_fd = AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd,width,height,fps, "div3"); - if(asize) - AVI_set_audio(lav_fd->avi_fd,achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'M': - veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI mp4v"); - lav_fd->avi_fd = AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd,width,height,fps, "mp4v"); - if(asize) - AVI_set_audio(lav_fd->avi_fd,achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'b': - case 'd': - veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in AVI dvsd"); - lav_fd->avi_fd = AVI_open_output_file(filename); - if(!lav_fd->avi_fd) - { - free(lav_fd); - return NULL; - } - AVI_set_video(lav_fd->avi_fd,width,height,fps, "dvsd"); - if(asize) AVI_set_audio(lav_fd->avi_fd,achans,arate,asize,WAVE_FORMAT_PCM); - return lav_fd; - case 'q': - case 'Q': + } else { #ifdef HAVE_LIBQUICKTIME /* open quicktime output file */ /* since the documentation says that the file should be empty, we try to remove it first */ - veejay_msg(VEEJAY_MSG_DEBUG, "\tWriting output file in Quicktime MJPA/JPEG"); remove(filename); lav_fd->qt_fd = quicktime_open(filename, 0, 1); @@ -434,10 +408,10 @@ lav_file_t *lav_open_output_file(char *filename, char format, return NULL; } if(format=='q') - quicktime_set_video(lav_fd->qt_fd, 1, width, height, fps, + quicktime_set_video(lav_fd->qt_fd, 1, width, height, fps, (interlaced ? QUICKTIME_MJPA : QUICKTIME_JPEG)); else - quicktime_set_video(lav_fd->qt_fd,1, width,height,fps, + quicktime_set_video(lav_fd->qt_fd,1, width,height,fps, QUICKTIME_DV ); if (asize) quicktime_set_audio(lav_fd->qt_fd, achans, arate, asize, QUICKTIME_TWOS); @@ -450,10 +424,9 @@ lav_file_t *lav_open_output_file(char *filename, char format, veejay_msg(VEEJAY_MSG_DEBUG, "(C) %s by %s, %s, has keyframes = %d", copyright,name,info,has_kf ); - return lav_fd; #else - veejay_msg(0,"Quicktime not included in build process. Abort"); + veejay_msg(0,"Quicktime not compiled in, cannot use Quicktime."); internal_error = ERROR_FORMAT; return NULL; #endif @@ -1125,23 +1098,22 @@ int lav_set_audio_position(lav_file_t *lav_file, long clip) return (AVI_set_audio_position(lav_file->avi_fd,clip*lav_file->bps)); } -long lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps) +int lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps) { - - if(!lav_file->has_audio) - { - internal_error = ERROR_NOAUDIO; - return -1; - } + if(!lav_file->has_audio) + { + internal_error = ERROR_NOAUDIO; + return -1; + } #ifdef SUPPORT_READ_DV2 if(video_format == 'b') return rawdv_read_audio_frame( lav_file->dv_fd, audbuf ); #endif #ifdef USE_GDK_PIXBUF - if(video_format == 'x') - return 0; + if(video_format == 'x') + return 0; #endif - video_format = lav_file->format; internal_error = 0; /* for error messages */ + video_format = lav_file->format; internal_error = 0; /* for error messages */ #ifdef HAVE_LIBQUICKTIME if( video_format == 'q') { @@ -1167,29 +1139,30 @@ long lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps) qt_audio[(channels*i) + j] = qt_audion[j][i]; } - if (lav_detect_endian()) - { - i= 0; - while (i < (2*res) ) - { - b0 = 0; - b1 = 0; - b0 = (qt_audio[i] & 0x00FF); - b1 = (qt_audio[i] & 0xFF00) >> 8; - qt_audio[i] = (b0 <<8) + b1; - i = i +1; - } - } + if (lav_detect_endian()) + { + i= 0; + while (i < (2*res) ) + { + b0 = 0; + b1 = 0; + b0 = (qt_audio[i] & 0x00FF); + b1 = (qt_audio[i] & 0xFF00) >> 8; + qt_audio[i] = (b0 <<8) + b1; + i = i +1; + } + } out: - for (j = 0; j < channels; j++) - free(qt_audion[j]); - free(qt_audion); - return(res); - - + for (j = 0; j < channels; j++) + free(qt_audion[j]); + free(qt_audion); + return(res); } #endif - return (AVI_read_audio(lav_file->avi_fd,audbuf,samps*lav_file->bps)/lav_file->bps); + + int res = AVI_read_audio( lav_file->avi_fd, audbuf, + (samps * lav_file->bps) ); + return res; } int lav_filetype(lav_file_t *lav_file) diff --git a/veejay-current/libel/lav_io.h b/veejay-current/libel/lav_io.h index f2b846f0..61bb1d9d 100644 --- a/veejay-current/libel/lav_io.h +++ b/veejay-current/libel/lav_io.h @@ -102,7 +102,7 @@ int lav_seek_start(lav_file_t *lav_file); int lav_set_video_position(lav_file_t *lav_file, long frame); int lav_read_frame(lav_file_t *lav_file, uint8_t *vidbuf); int lav_set_audio_position(lav_file_t *lav_file, long clip); -long lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps); +int lav_read_audio(lav_file_t *lav_file, uint8_t *audbuf, long samps); int lav_filetype(lav_file_t *lav_file); lav_file_t *lav_open_input_file(char *filename, int mmap_size); int lav_get_field_size(uint8_t * jpegdata, long jpeglen); diff --git a/veejay-current/libel/vj-avcodec.c b/veejay-current/libel/vj-avcodec.c index a8e32cfe..80e1a284 100644 --- a/veejay-current/libel/vj-avcodec.c +++ b/veejay-current/libel/vj-avcodec.c @@ -211,10 +211,9 @@ void vj_avcodec_close_encoder( vj_encoder *av ) free(av->data[1]); if(av->data[2]) free(av->data[2]); - free(av); - if(av->lzo) lzo_free(av->lzo); + free(av); } av = NULL; } diff --git a/veejay-current/libel/vj-el.c b/veejay-current/libel/vj-el.c index 06f5916b..eace203f 100644 --- a/veejay-current/libel/vj-el.c +++ b/veejay-current/libel/vj-el.c @@ -726,7 +726,7 @@ int open_video_file(char *filename, editlist * el, int preserve_pathname, int de el->has_audio = (el->audio_chans == 0 ? 0: 1); el->audio_bits = lav_audio_bits(el->lav_fd[n]); - el->play_rate = el->audio_rate = lav_audio_rate(el->lav_fd[n]); + el->audio_rate = lav_audio_rate(el->lav_fd[n]); el->audio_bps = (el->audio_bits * el->audio_chans + 7) / 8; } else @@ -964,8 +964,8 @@ int vj_el_get_video_frame(editlist *el, long nframe, uint8_t *dst[3]) if (nframe < 0) nframe = 0; - if (nframe > el->video_frames) - nframe = el->video_frames; + if (nframe >= el->video_frames) + nframe = el->video_frames-1; n = el->frame_list[nframe]; @@ -1314,14 +1314,14 @@ int vj_el_get_audio_frame(editlist *el, uint32_t nframe, uint8_t *dst) return 1; } - if (!el->has_audio) - return 0; + if (!el->has_audio) + return 0; - if (nframe < 0) + if (nframe < 0) nframe = 0; - if (nframe > el->video_frames) - nframe = el->video_frames; + if (nframe >= el->video_frames) + nframe = el->video_frames-1; n = el->frame_list[nframe]; @@ -1413,8 +1413,8 @@ int vj_el_get_audio_frame_at(editlist *el, uint32_t nframe, uint8_t *dst, int nu if (nframe < 0) nframe = 0; - if (nframe > el->video_frames) - nframe = el->video_frames - num; + if (nframe >= el->video_frames) + nframe = el->video_frames - 1; n = el->frame_list[nframe]; @@ -1451,7 +1451,6 @@ editlist *vj_el_dummy(int flags, int deinterlace, int chroma, char norm, int wid el->audio_bits = 0; el->audio_bps = 0; el->audio_chans = 0; - el->play_rate = 0; el->num_video_files = 0; el->video_width = width; el->video_height = height; @@ -2061,7 +2060,6 @@ editlist *vj_el_soft_clone(editlist *el) clone->audio_chans = el->audio_chans; clone->audio_bits = el->audio_bits; clone->audio_bps = el->audio_bps; - clone->play_rate = el->play_rate; clone->video_frames = el->video_frames; clone->num_video_files = el->num_video_files; clone->max_frame_size = el->max_frame_size; diff --git a/veejay-current/libel/vj-el.h b/veejay-current/libel/vj-el.h index 156d5463..67f16fda 100644 --- a/veejay-current/libel/vj-el.h +++ b/veejay-current/libel/vj-el.h @@ -51,7 +51,6 @@ typedef struct int audio_chans; int audio_bits; int audio_bps; - int play_rate; long video_frames; diff --git a/veejay-current/libsample/sampleadm.c b/veejay-current/libsample/sampleadm.c index 0fb830fe..47949b54 100644 --- a/veejay-current/libsample/sampleadm.c +++ b/veejay-current/libsample/sampleadm.c @@ -481,6 +481,8 @@ int sample_get_longest(int sample_id) int speed = abs(si->speed); int duration = len / speed; //how many frames are played of this sample +veejay_msg(0, "sample %d: %d - %d", sample_id, si->first_frame,si->last_frame ); + if( si->looptype == 2) duration *= 2; // pingpong loop duration for(c=0; c < SAMPLE_MAX_EFFECTS; c++) @@ -503,6 +505,9 @@ int sample_get_longest(int sample_id) veejay_msg(VEEJAY_MSG_WARNING, "Length of sample in video frames: %ld",duration); return duration; } +#ifdef STRICT_CHECKING + assert(0); +#endif return 0; } @@ -2045,8 +2050,12 @@ int sample_chain_sprint_status( int s1,int cache,int sa,int ca, int pfps, int fr sample_info *sample; sample = sample_get(s1); if (!sample) + { +#ifdef STRICT_CHECKING + veejay_msg(0, "Fatal : sample %d is invalid, cannot produce a valid status line", s1 ); +#endif return -1; - + } sprintf(str, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", pfps, diff --git a/veejay-current/libsamplerec/samplerecord.c b/veejay-current/libsamplerec/samplerecord.c index 1d529382..b8964898 100644 --- a/veejay-current/libsamplerec/samplerecord.c +++ b/veejay-current/libsamplerec/samplerecord.c @@ -202,7 +202,7 @@ static int sample_start_encoder(sample_info *si, editlist *el, int format, long si->encoder_file = (void*)lav_open_output_file(si->encoder_destination,cformat, el->video_width,el->video_height,el->video_inter, - el->video_fps,0,0,0); + el->video_fps,el->audio_bits, el->audio_chans, el->audio_rate ); if(!si->encoder_file) { @@ -337,15 +337,14 @@ int sample_record_frame(int s1, uint8_t *buffer[3], uint8_t *abuff, int audio_si si->rec_total_bytes += buf_len; -/* if(audio_size > 0) + if(audio_size > 0) { if(lav_write_audio( (lav_file_t*) si->encoder_file, (uint8_t*)abuff, audio_size)) { veejay_msg(VEEJAY_MSG_ERROR, "Error writing output audio [%s] (%d)",lav_strerror(),audio_size); } - // estimate samples , dont care - si->rec_total_bytes += ( audio_size * 4 ); - }*/ + si->rec_total_bytes += audio_size; + } /* write OK */ si->encoder_succes_frames ++; si->encoder_num_frames ++; diff --git a/veejay-current/share/gveejay.reloaded.glade b/veejay-current/share/gveejay.reloaded.glade index 2b7c0021..95542d9e 100644 --- a/veejay-current/share/gveejay.reloaded.glade +++ b/veejay-current/share/gveejay.reloaded.glade @@ -1146,7 +1146,8 @@ - Duplication factor + True + Slow motion multiplier False False GTK_JUSTIFY_LEFT @@ -1170,6 +1171,7 @@ + True True 1 0 @@ -1177,7 +1179,7 @@ GTK_UPDATE_ALWAYS False False - 1 0 100 1 10 10 + 1 1 12 1 10 10 @@ -10839,7 +10841,7 @@ MLZO - + True 0 0.5 diff --git a/veejay-current/veejay/liblavplayvj.c b/veejay-current/veejay/liblavplayvj.c index 9ec67423..42f7195b 100644 --- a/veejay-current/veejay/liblavplayvj.c +++ b/veejay-current/veejay/liblavplayvj.c @@ -93,7 +93,9 @@ #include #include - +#ifdef STRICT_CHECKING +#include +#endif #ifdef USE_GL #include #endif @@ -275,6 +277,7 @@ void veejay_change_state_save(veejay_t * info, int new_state) int veejay_set_framedup(veejay_t *info, int n) { video_playback_setup *settings = (video_playback_setup*) settings; + switch(info->uc->playback_mode) { case VJ_PLAYBACK_MODE_PLAIN: info->sfd = n; break; case VJ_PLAYBACK_MODE_SAMPLE: info->sfd = n; sample_set_framedup(info->uc->sample_id,n);break; @@ -540,7 +543,7 @@ void veejay_set_framerate( veejay_t *info , float fps ) settings->spvf = 1.0 / fps; settings->msec_per_frame = 1000 / settings->spvf; if (info->current_edit_list->has_audio && (info->audio==AUDIO_PLAY || info->audio==AUDIO_RENDER)) - settings->spas = 1.0 / (double) info->current_edit_list->play_rate; + settings->spas = 1.0 / (double) info->current_edit_list->audio_rate; else settings->spas = 0; @@ -583,7 +586,7 @@ int veejay_init_editlist(veejay_t * info) if (el->has_audio && (info->audio==AUDIO_PLAY || info->audio==AUDIO_RENDER)) { - settings->spas = 1.0 / (double) el->play_rate; + settings->spas = 1.0 / (double) el->audio_rate; } else { @@ -1151,7 +1154,12 @@ void veejay_pipe_write_status(veejay_t * info, int link_id) if( sample_chain_sprint_status (info->uc->sample_id,cache_used,info->seq->active,info->seq->current,info->real_fps,settings->current_frame_num, pm, total_slots,info->status_what ) != 0) { - veejay_msg(VEEJAY_MSG_ERROR, "Invalid status!"); + veejay_msg(VEEJAY_MSG_ERROR, "Fatal error, tried to collect properties of invalid sample"); +#ifdef STRICT_CHECKING + assert(0); +#else + veejay_change_state( info, LAVPLAY_STATE_STOP ); +#endif } break; case VJ_PLAYBACK_MODE_PLAIN: @@ -1903,12 +1911,16 @@ int veejay_init(veejay_t * info, int x, int y,char *arg, int def_tags, int full_ //plugins_allocate(); - if(info->current_edit_list->has_audio) { - if (vj_perform_init_audio(info) == 0) + if(info->current_edit_list->has_audio) + { + if (vj_perform_init_audio(info)) veejay_msg(VEEJAY_MSG_INFO, "Initialized Audio Task"); else + { veejay_msg(VEEJAY_MSG_ERROR, "Unable to initialize Audio Task"); + info->audio = NO_AUDIO; + } } veejay_msg(VEEJAY_MSG_INFO, @@ -2188,7 +2200,6 @@ static void veejay_playback_cycle(veejay_t * info) double tdiff1, tdiff2; int n; int first_free, frame, skipv, skipa, skipi, nvcorr; - long frame_number[2]; /* Must be at least as big as the number of buffers used */ struct mjpeg_params bp; long ts, te; vj_perform_queue_audio_frame(info,0); @@ -2243,21 +2254,16 @@ static void veejay_playback_cycle(veejay_t * info) - frame_number[0] = settings->current_frame_num; veejay_mjpeg_queue_buf(info, 0, 1); stats.nqueue = 1; - // settings->br.count; + while (settings->state != LAVPLAY_STATE_STOP) { - /* Sync to get a free buffer. We want to have all free buffers, - * which have been played so far. Normally there should be a function - * in the kernel API to get the number of all free buffers. - * I don't want to change this API at the moment, therefore - * we look on the clock to see if there are more buffers ready - */ first_free = stats.nsync; + int current_speed = settings->current_playback_speed; + do { if (settings->state == LAVPLAY_STATE_STOP) { goto FINISH; @@ -2268,26 +2274,17 @@ static void veejay_playback_cycle(veejay_t * info) } frame = bs.frame; - /* Since we queue the frames in order, we have to get them back in order */ - if (frame != stats.nsync % 1) { - veejay_msg(VEEJAY_MSG_ERROR, - "**INTERNAL ERROR: Bad frame order on sync: frame = %d, nsync = %d, br.count = %ld sould be %ld", - frame, stats.nsync, 1, (stats.nsync % 1)); - veejay_change_state_save(info, LAVPLAY_STATE_STOP); - goto FINISH; - } - + stats.nsync++; - /* Lock on clock */ gettimeofday(&time_now, 0); stats.tdiff = time_now.tv_sec - bs.timestamp.tv_sec + (time_now.tv_usec - bs.timestamp.tv_usec)*1.e-6; - } while (stats.tdiff > settings->spvf && (stats.nsync - first_free) < (1 - 1)); + } + while (stats.tdiff > settings->spvf && (stats.nsync - first_free) < (1 - 1)); #ifdef HAVE_JACK - if ( el->has_audio && info->audio==AUDIO_PLAY ) { - //audio_get_output_status(&audio_tmstmp, &(stats.num_asamps), - // &(stats.num_aerr)); + if ( el->has_audio && info->audio==AUDIO_PLAY ) + { struct timeval audio_tmstmp; long int sec=0; long int usec=0; @@ -2295,13 +2292,10 @@ static void veejay_playback_cycle(veejay_t * info) audio_tmstmp.tv_sec = sec; audio_tmstmp.tv_usec = usec; if (audio_tmstmp.tv_sec) - { - tdiff1 = settings->spvf * (stats.nsync - nvcorr) - - settings->spas * num_audio_bytes_written; - tdiff2 = (bs.timestamp.tv_sec - audio_tmstmp.tv_sec) + - (bs.timestamp.tv_usec - audio_tmstmp.tv_usec) * 1.e-6; - } - + { + tdiff1 = settings->spvf * (stats.nsync - nvcorr) - settings->spas * num_audio_bytes_written; + tdiff2 = (bs.timestamp.tv_sec - audio_tmstmp.tv_sec) + (bs.timestamp.tv_usec - audio_tmstmp.tv_usec) * 1.e-6; + } } #endif stats.tdiff = tdiff1 - tdiff2; @@ -2316,7 +2310,7 @@ static void veejay_playback_cycle(veejay_t * info) if (stats.tdiff > settings->spvf) { /* Video is ahead audio */ skipa = 1; - if (info->sync_ins_frames) + if (info->sync_ins_frames && current_speed != 0) skipi = 1; nvcorr++; stats.num_corrs_a++; @@ -2326,73 +2320,40 @@ static void veejay_playback_cycle(veejay_t * info) if (stats.tdiff < -settings->spvf) { /* Video is behind audio */ skipv = 1; - if (!info->sync_skip_frames) + if (!info->sync_skip_frames && current_speed != 0) skipi = 1; - //veejay_msg(VEEJAY_MSG_INFO, "video behind audio, skip video frame = %s tdiff = %4.2f , spvf = %4.2f", - // (skipi==0?"NO":"YES"), stats.tdiff, settings->spvf); - nvcorr--; + nvcorr--; stats.num_corrs_b++; stats.tdiff += settings->spvf; stats.stats_changed = 1; } } - /* Read one frame, break if EOF is reached */ #ifdef HAVE_SDL ts= SDL_GetTicks(); #endif - // actually measure duration of render in ms */ frame = n % 1; - frame_number[frame] = settings->current_frame_num; - settings->buffer_entry[frame] = settings->current_frame_num; -// el->frame_list[settings->current_frame_num]; + // settings->buffer_entry[frame] = 1; //settings->current_frame_num; + settings->buffer_entry[frame] ++; + if (!skipa) - vj_perform_queue_audio_frame(info,frame); + vj_perform_queue_audio_frame(info,frame); if (!skipv) vj_perform_queue_video_frame(info,frame,skipi); - vj_perform_queue_frame(info,skipi,frame); +// vj_perform_queue_frame(info,skipi,frame); + + vj_perform_queue_frame( info, frame, skipi ); + #ifdef HAVE_SDL te = SDL_GetTicks(); -#endif -// if(info->real_fps == -1) -// { -/* float elapsed = (float)(te-ts)/1000.0; - float spvf = info->settings->spvf; - int level = VEEJAY_MSG_INFO; - if(elapsed > (spvf*0.8) && elapsed < spvf) - { - level = VEEJAY_MSG_WARNING; - } - else - { - if( elapsed > spvf) - level = VEEJAY_MSG_ERROR; - } - veejay_msg( level, - "Seconds per video frame: %2.2f, seconds elapsed: %2.4f ", - (float)info->settings->spvf, - elapsed ); - */ - // } -#ifdef HAVE_SDL info->real_fps = (int)( te - ts ); #else info->real_fps = 0; #endif - // int sta_poll = vj_server_poll(info->vjs[1]); - // if(sta_poll>0) vj_server_new_connection( info->vjs[1]); - // int i; - // for( i = 0; i < info->vjs[1]->nr_of_links; i ++ ) - // veejay_pipe_write_status( info, i ); -// int i; -// for( i = 0; i < VJ_MAX_CONNECTIONS; i ++ ) -// if( vj_server_link_used( info->vjs[1], i )) -// { veejay_msg(VEEJAY_MSG_DEBUG, "sent sta"); veejay_pipe_write_status( info, i );} - if(skipv ) continue; if (!veejay_mjpeg_queue_buf(info, frame, 1)) { veejay_msg(VEEJAY_MSG_ERROR ,"Error queuing a frame"); @@ -3377,7 +3338,7 @@ static int veejay_open_video_files(veejay_t *info, char **files, int num_files, { editlist *el = info->current_edit_list; el->has_audio = 1; - el->play_rate = el->audio_rate = info->dummy->arate; + el->audio_rate = info->dummy->arate; el->audio_chans = 2; el->audio_bits = 16; el->audio_bps = 4; diff --git a/veejay-current/veejay/vims.h b/veejay-current/veejay/vims.h index 44e7b6fb..f3ef08f5 100644 --- a/veejay-current/veejay/vims.h +++ b/veejay-current/veejay/vims.h @@ -90,7 +90,7 @@ enum { VIMS_VIDEO_SET_SLOW = 21, VIMS_VIDEO_MCAST_START = 22, VIMS_VIDEO_MCAST_STOP = 23, - + VIMS_VIDEO_SET_SPEEDK = 24, /* editlist commands */ VIMS_EDITLIST_PASTE_AT = 50, diff --git a/veejay-current/veejay/vj-bjack.h b/veejay-current/veejay/vj-bjack.h index e87cd420..317c6ceb 100644 --- a/veejay-current/veejay/vj-bjack.h +++ b/veejay-current/veejay/vj-bjack.h @@ -26,6 +26,7 @@ int vj_jack_reset(); int vj_jack_play(void *data, int len); int vj_jack_pause(); int vj_jack_resume(); +int vj_jack_rate(); int vj_jack_get_space(); long vj_jack_get_status(long int *sec, long int *usec); int vj_jack_set_volume(int v); diff --git a/veejay-current/veejay/vj-event.c b/veejay-current/veejay/vj-event.c index 8af51386..25a3c306 100644 --- a/veejay-current/veejay/vj-event.c +++ b/veejay-current/veejay/vj-event.c @@ -168,15 +168,15 @@ static struct { /* hardcoded keyboard layout (the default keys) */ { VIMS_VIDEO_PREV_SECOND, SDLK_KP2, VIMS_MOD_NONE, NULL }, { VIMS_VIDEO_GOTO_START, SDLK_KP1, VIMS_MOD_NONE, NULL }, { VIMS_VIDEO_GOTO_END, SDLK_KP3, VIMS_MOD_NONE, NULL }, - { VIMS_VIDEO_SET_SPEED, SDLK_a, VIMS_MOD_NONE, "1" }, - { VIMS_VIDEO_SET_SPEED, SDLK_s, VIMS_MOD_NONE, "2" }, - { VIMS_VIDEO_SET_SPEED, SDLK_d, VIMS_MOD_NONE, "3" }, - { VIMS_VIDEO_SET_SPEED, SDLK_f, VIMS_MOD_NONE, "4" }, - { VIMS_VIDEO_SET_SPEED, SDLK_g, VIMS_MOD_NONE, "5" }, - { VIMS_VIDEO_SET_SPEED, SDLK_h, VIMS_MOD_NONE, "6" }, - { VIMS_VIDEO_SET_SPEED, SDLK_j, VIMS_MOD_NONE, "7" }, - { VIMS_VIDEO_SET_SPEED, SDLK_k, VIMS_MOD_NONE, "8" }, - { VIMS_VIDEO_SET_SPEED, SDLK_l, VIMS_MOD_NONE, "9" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_a, VIMS_MOD_NONE, "1" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_s, VIMS_MOD_NONE, "2" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_d, VIMS_MOD_NONE, "3" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_f, VIMS_MOD_NONE, "4" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_g, VIMS_MOD_NONE, "5" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_h, VIMS_MOD_NONE, "6" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_j, VIMS_MOD_NONE, "7" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_k, VIMS_MOD_NONE, "8" }, + { VIMS_VIDEO_SET_SPEEDK, SDLK_l, VIMS_MOD_NONE, "9" }, { VIMS_VIDEO_SET_SLOW, SDLK_a, VIMS_MOD_ALT, "1" }, { VIMS_VIDEO_SET_SLOW, SDLK_s, VIMS_MOD_ALT, "2" }, { VIMS_VIDEO_SET_SLOW, SDLK_d, VIMS_MOD_ALT, "3" }, @@ -1229,7 +1229,7 @@ void vj_event_update_remote(void *ptr) // for( i = 0; i < VJ_MAX_CONNECTIONS; i ++ ) // if( vj_server_link_used( v->vjs[1], i )) // veejay_pipe_write_status( v, i ); -// + if( v->settings->use_vims_mcast ) { int res = vj_server_update(v->vjs[2],0 ); @@ -1282,6 +1282,7 @@ void vj_event_update_remote(void *ptr) } } } + for( i = 0; i < VJ_MAX_CONNECTIONS; i ++ ) if( vj_server_link_used( v->vjs[1], i )) veejay_pipe_write_status( v, i ); @@ -3057,6 +3058,32 @@ void vj_event_play_speed(void *ptr, const char format[], va_list ap) } } +void vj_event_play_speed_kb(void *ptr, const char format[], va_list ap) +{ + int args[2]; + veejay_t *v = (veejay_t*) ptr; + if(!STREAM_PLAYING(v)) + { + char *s = NULL; + P_A(args,s,format,ap); + + int speed = abs(args[0]); + if( v->settings->current_playback_speed < 0 ) + veejay_set_speed( v, -1 * speed ); + else + veejay_set_speed(v, speed ); + speed = v->settings->current_playback_speed; + veejay_msg(VEEJAY_MSG_INFO, "Video is playing at speed %d now (%s)", + speed, speed == 0 ? "paused" : speed < 0 ? "reverse" : "forward" ); + } + else + { + p_invalid_mode(); + } +} + + + void vj_event_play_slow(void *ptr, const char format[],va_list ap) { int args[1]; @@ -3706,7 +3733,6 @@ void vj_event_sample_rec_start( void *ptr, const char format[], va_list ap) { veejay_t *v = (veejay_t *)ptr; int args[2]; - int changed = 0; int result = 0; char *str = NULL; char prefix[150]; @@ -3742,7 +3768,6 @@ void vj_event_sample_rec_start( void *ptr, const char format[], va_list ap) if (n < 0 ) n = n * -1; } args[0] = sample_get_longest(v->uc->sample_id); - changed = 1; } int format_ = _recorder_format; @@ -3762,16 +3787,15 @@ void vj_event_sample_rec_start( void *ptr, const char format[], va_list ap) { video_playback_setup *s = v->settings; s->sample_record_id = v->uc->sample_id; - if(args[1]) - s->sample_record_switch = 1; + s->sample_record_switch = args[1]; result = 1; if(v->use_osd) { veejay_msg(VEEJAY_MSG_INFO,"Turned off OSD, recording now"); v->use_osd = 0; } - veejay_msg(VEEJAY_MSG_INFO, "Sample recording started , record %d frames and %s", - args[0], (args[1] == 1 ? "play new sample" : "dont play new sample" )); + veejay_msg(VEEJAY_MSG_INFO, "Sample recording started , record %d frames from sample %d and %s", + args[0],s->sample_record_id, (args[1] == 1 ? "play new sample" : "dont play new sample" )); } else { diff --git a/veejay-current/veejay/vj-event.h b/veejay-current/veejay/vj-event.h index 68a5c02e..214f0d5b 100644 --- a/veejay-current/veejay/vj-event.h +++ b/veejay-current/veejay/vj-event.h @@ -102,6 +102,7 @@ void vj_event_output_raw_stop ( void *ptr, const char format[], va_list ap ); void vj_event_play_forward ( void *ptr, const char format[], va_list ap ); void vj_event_play_reverse ( void *ptr, const char format[], va_list ap ); void vj_event_play_speed ( void *ptr, const char format[], va_list ap ); +void vj_event_play_speed_kb ( void *ptr, const char format[], va_list ap ); void vj_event_play_slow ( void *ptr, const char format[], va_list ap ); void vj_event_play_stop ( void *ptr, const char format[], va_list ap ); void vj_event_prev_second ( void *ptr, const char format[], va_list ap ); diff --git a/veejay-current/veejay/vj-eventman.c b/veejay-current/veejay/vj-eventman.c index 51508007..37fa213d 100644 --- a/veejay-current/veejay/vj-eventman.c +++ b/veejay-current/veejay/vj-eventman.c @@ -453,7 +453,18 @@ void vj_init_vevo_events(void) 0, VIMS_ALLOW_ANY, NULL ); - + + index_map_[VIMS_VIDEO_SET_SPEEDK] = _new_event( + "%d", + VIMS_VIDEO_SET_SPEED, + "Change trickplay speed depending on play direction", + vj_event_play_speed_kb, + 1, + VIMS_ALLOW_ANY, + "Frame step", + 1, + NULL ); + index_map_[VIMS_VIDEO_SET_SPEED] = _new_event( "%d", VIMS_VIDEO_SET_SPEED, diff --git a/veejay-current/veejay/vj-misc.h b/veejay-current/veejay/vj-misc.h index 0952b296..b5f72b21 100644 --- a/veejay-current/veejay/vj-misc.h +++ b/veejay-current/veejay/vj-misc.h @@ -21,8 +21,8 @@ #include #include "vj-lib.h" -#define VEEJAY_FILE_LIMIT (1048576 * 1900) - +//#define VEEJAY_FILE_LIMIT (1048576 * 1900) +#define VEEJAY_FILE_LIMIT (1048576 * 32000) int available_diskspace(void); int vj_perform_screenshot2(veejay_t * info, uint8_t ** src); diff --git a/veejay-current/veejay/vj-perform.c b/veejay-current/veejay/vj-perform.c index 77adb370..00eb140a 100644 --- a/veejay-current/veejay/vj-perform.c +++ b/veejay-current/veejay/vj-perform.c @@ -58,6 +58,10 @@ #include #include #include +#ifdef STRICT_CHECKING +#include +#endif + #define PERFORM_AUDIO_SIZE 16384 static int simple_frame_duplicator; @@ -97,21 +101,21 @@ static int cached_sample_frames[CACHE_SIZE]; static int frame_info[64][SAMPLE_MAX_EFFECTS]; /* array holding frame lengths */ static uint8_t *audio_buffer[SAMPLE_MAX_EFFECTS]; /* the audio buffer */ static uint8_t *top_audio_buffer; -static uint8_t *tmp_audio_buffer; -static uint8_t *x_audio_buffer; +static uint8_t *resample_audio_buffer; +static uint8_t *audio_render_buffer; +static uint8_t *down_sample_buffer; static uint8_t *temp_buffer[3]; static uint8_t *socket_buffer; static ycbcr_frame *record_buffer; // needed for recording invisible streams -static short *priv_audio[2]; static VJFrame *helper_frame; -//#ifdef HAVE_FREETYPE -//static VJFrame *font_frame; -//#endif static int vj_perform_record_buffer_init(); static void vj_perform_record_buffer_free(); - -static ReSampleContext *resample_context[MAX_SPEED]; -static ReSampleContext *resample_jack; +#ifdef HAVE_JACK +static int jack_rate_ = 0; +static ReSampleContext *resample_context[(MAX_SPEED+1)]; +static ReSampleContext *downsample_context[(MAX_SPEED+1)]; +static ReSampleContext *resample_jack = NULL; +#endif #define MLIMIT(var, low, high) \ if((var) < (low)) { var = (low); } \ @@ -119,7 +123,7 @@ if((var) > (high)) { var = (high); } //forward -static inline void vj_perform_pre_chain(veejay_t *info, VJFrame *frame); +static void vj_perform_pre_chain(veejay_t *info, VJFrame *frame); static void vj_perform_post_chain_sample(veejay_t *info, VJFrame *frame); static void vj_perform_post_chain_tag(veejay_t *info, VJFrame *frame); static void seq_play_sample( veejay_t *info, int n); @@ -234,7 +238,10 @@ static int vj_perform_increase_plain_frame(veejay_t * info, long num) { video_playback_setup *settings = info->settings; //settings->current_frame_num += num; - simple_frame_duplicator+=2; + //simple_frame_duplicator+=2; + + simple_frame_duplicator++; + if (simple_frame_duplicator >= info->sfd) { settings->current_frame_num += num; simple_frame_duplicator = 0; @@ -355,10 +362,13 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) settings->current_playback_speed = speed; simple_frame_duplicator++; - if (simple_frame_duplicator >= info->sfd) { + + if (simple_frame_duplicator >= info->sfd) + { settings->current_frame_num += num; - simple_frame_duplicator = 0; - } + simple_frame_duplicator = 0; + } + if (speed >= 0) { /* forward play */ if(looptype==3) @@ -380,10 +390,6 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) } break; case 1: - // if(sample_get_loop_dec(info->uc->sample_id)) { - // sample_apply_loop_dec( info->uc->sample_id, info->edit_list->video_fps); - // start = sample_get_startFrame(info->uc->sample_id); - // } if(! info->seq->active ) veejay_set_frame(info, start); else @@ -392,7 +398,6 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) if( n >= 0 ) { seq_play_sample( info, n ); - // veejay_set_sample( info, info->seq->samples[ info->seq->current ] ); } else veejay_set_frame(info,start); @@ -425,9 +430,7 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) veejay_set_speed(info, (-1 * speed)); } break; - case 1: - //sample_apply_loop_dec( info->uc->sample_id, info->edit_list->video_fps); if(!info->seq->active) veejay_set_frame(info, end); else @@ -436,7 +439,6 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) if( n >= 0 ) { seq_play_sample(info, n ); - // veejay_set_sample( info, info->seq->samples[ info->seq->current ] ); } else veejay_set_frame(info,end); @@ -718,98 +720,99 @@ int vj_perform_init(veejay_t * info, int use_vp) static void vj_perform_close_audio() { int i; - for(i=0; i < SAMPLE_MAX_EFFECTS; i++) - { - if(audio_buffer[i]) free(audio_buffer[i]); - } - if(tmp_audio_buffer) free(tmp_audio_buffer); + for(i=0; i < SAMPLE_MAX_EFFECTS; i++) + if(audio_buffer[i]) free(audio_buffer[i]); + if(top_audio_buffer) free(top_audio_buffer); - if(x_audio_buffer) free(x_audio_buffer); - if(priv_audio[0]) free(priv_audio[0]); - if(priv_audio[1]) free(priv_audio[1]); - if(resample_context) + if(resample_audio_buffer) free(resample_audio_buffer); + if(audio_render_buffer) free( audio_render_buffer ); + if(down_sample_buffer) free( down_sample_buffer ); +#ifdef HAVE_JACK + for(i=0; i <= MAX_SPEED; i ++) { - int i; - for(i=1; i <= MAX_SPEED; i ++) - { - if(resample_context[(i-1)]) - audio_resample_close( resample_context[(i-1)] ); - } + if(resample_context[i]) + audio_resample_close( resample_context[i] ); + if(downsample_context[i]) + audio_resample_close( downsample_context[i]); } +#endif + if(resample_jack) audio_resample_close(resample_jack); - /* temporary buffer */ - //if(bad_audio) free(bad_audio); + veejay_msg(VEEJAY_MSG_INFO, "Stopped Audio playback task"); } int vj_perform_init_audio(veejay_t * info) { // video_playback_setup *settings = info->settings; - int i; #ifndef HAVE_JACK - return 1; -#endif - if(info->audio==AUDIO_PLAY) - { - //vj_jack_start(); - } + return 0; +#else + int i; + if(!info->audio ) + { + veejay_msg(0,"No audio found"); + return 0; + } /* top audio frame */ top_audio_buffer = - (uint8_t *) vj_malloc(sizeof(uint8_t) * 2 * PERFORM_AUDIO_SIZE); + (uint8_t *) vj_calloc(sizeof(uint8_t) * 2 * PERFORM_AUDIO_SIZE); if(!top_audio_buffer) return 0; - x_audio_buffer = (uint8_t*) vj_malloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE); - if(!x_audio_buffer) return 0; - veejay_memset( x_audio_buffer,0,PERFORM_AUDIO_SIZE); - veejay_memset( top_audio_buffer, 0 ,2 * PERFORM_AUDIO_SIZE ); + down_sample_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE * MAX_SPEED *4 ); + if(!down_sample_buffer) + return 0; + audio_render_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE * MAX_SPEED * 4 ); + if(!audio_render_buffer) + return 0; + + resample_audio_buffer = (uint8_t*) vj_calloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE * 2); + if(!resample_audio_buffer) + return 0; + /* chained audio */ for (i = 0; i < SAMPLE_MAX_EFFECTS; i++) { audio_buffer[i] = - (uint8_t *) vj_malloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE); - veejay_memset(audio_buffer[i], 0, PERFORM_AUDIO_SIZE); + (uint8_t *) vj_calloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE); + if(!audio_buffer[i]) + return 0; } - /* temporary buffer */ -// bad_audio = -// (uint8_t *) vj_malloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE * -// (2 * SAMPLE_MAX_EFFECTS )); -// memset(bad_audio, 0, PERFORM_AUDIO_SIZE * (2 * SAMPLE_MAX_EFFECTS)); - tmp_audio_buffer = - (uint8_t *) vj_malloc(sizeof(uint8_t) * PERFORM_AUDIO_SIZE * 10); - if(!tmp_audio_buffer) return 0; - veejay_memset(tmp_audio_buffer, 0, PERFORM_AUDIO_SIZE * 10); - - for(i=0; i < 2; i ++) + + for( i = 0; i <= MAX_SPEED; i ++ ) { - priv_audio[i] = (short*) vj_malloc(sizeof(short) * PERFORM_AUDIO_SIZE * 10 ); - if(!priv_audio[i]) return 0; - veejay_memset( priv_audio[i], 0, PERFORM_AUDIO_SIZE * 10 ); - } + int out_rate = (info->edit_list->audio_rate * (i+2)); + int down_rate = (info->edit_list->audio_rate / (i+2)); - if(!info->audio) return 0; -#ifdef HAVE_JACK - for(i=2; i <= MAX_SPEED; i++) - { - int out_rate = info->edit_list->audio_rate * i; - resample_context[(i-1)] = audio_resample_init( + resample_context[i] = audio_resample_init( info->edit_list->audio_chans, info->edit_list->audio_chans, info->edit_list->audio_rate, out_rate); - // (i * (info->edit_list->audio_rate/2))); - - if(!resample_context[(i-1)]) + if(!resample_context[i]) { - resample_context[(i-1)] = NULL; - veejay_msg(VEEJAY_MSG_WARNING, "Cannot initialize resampler"); + veejay_msg(VEEJAY_MSG_ERROR, "Cannot initialize audio upsampler for speed %d", i); + return 0; } - veejay_msg(VEEJAY_MSG_DEBUG, "Speed %d resamples audio to %d Hz ", i, out_rate ); + downsample_context[i] = audio_resample_init( + info->edit_list->audio_chans, + info->edit_list->audio_chans, + info->edit_list->audio_rate, + down_rate ); + if(!downsample_context[i]) + { + veejay_msg(VEEJAY_MSG_WARNING< "Cannot initialize audio downsampler for dup %d",i); + return 0; + } + + veejay_msg(VEEJAY_MSG_DEBUG, "Resampler %d: Speed %d resamples audio to %d Hz, Slow %d to %d Hz ", i,i+2,out_rate, + i+2, down_rate ); } + return 1; #endif - return 0; } void vj_perform_free(veejay_t * info) @@ -904,18 +907,18 @@ int vj_perform_audio_start(veejay_t * info) } if ( res == 2 ) { - // setup resampler context - veejay_msg(VEEJAY_MSG_WARNING, "Jack plays at %d Hz, resampling audio from %d -> %d",el->play_rate,el->audio_rate,el->play_rate); - resample_jack = audio_resample_init( el->audio_chans,el->audio_chans, el->play_rate, el->audio_rate); + jack_rate_ = vj_jack_rate(); + veejay_msg(VEEJAY_MSG_WARNING, "Jack plays at %d Hz, resampling audio from %d -> %d",jack_rate_,el->audio_rate,jack_rate_); + resample_jack = audio_resample_init( el->audio_chans,el->audio_chans, jack_rate_, el->audio_rate); if(!resample_jack) { resample_jack = NULL; veejay_msg(VEEJAY_MSG_WARNING, "Cannot initialize resampler for %d -> %d audio rate conversion ", - el->audio_rate,el->play_rate); + el->audio_rate,jack_rate_); } + return 0; - } return 1; #else @@ -1326,13 +1329,6 @@ static void vj_perform_reverse_audio_frame(veejay_t * info, int len, veejay_memcpy(buf+i ,buf+(x-i-bps),bps); veejay_memcpy(buf+(x-i-bps), sample,bps); } -/* - for (i = 0; i < (len * bps); i += bps) { - veejay_memcpy(sample, buf + i, bps); - veejay_memcpy(tmp_audio_buffer + (len * bps) - bps - i, sample, bps); - } - veejay_memcpy(buf, tmp_audio_buffer, (len * bps)); - */ } @@ -1717,86 +1713,99 @@ int vj_perform_new_audio_frame(veejay_t * info, char *dst_buf, int nframe, */ #define ARRAY_LEN(x) ((int)(sizeof(x)/sizeof((x)[0]))) -int vj_perform_fill_audio_buffers(veejay_t * info, uint8_t *audio_buf) +int vj_perform_fill_audio_buffers(veejay_t * info, uint8_t *audio_buf, uint8_t *temporary_buffer) { - video_playback_setup *settings = info->settings; - int len = 0; - //int i; - int top_sample = info->uc->sample_id; - int top_speed = sample_get_speed(top_sample); - //int vol_a = sample_get_audio_volume(top_sample); - /* take top frame */ + video_playback_setup *settings = info->settings; + int len = 0; + int speed = sample_get_speed(info->uc->sample_id); + int bps = info->edit_list->audio_bps; + int pred_len = (info->edit_list->audio_rate / info->edit_list->video_fps ); - - if (top_speed > 1 || top_speed < -1) + if( simple_frame_duplicator <= 0 ) { - //len = info->edit_list->audio_rate / info->edit_list->video_fps; - //mymemset_generic(audio_buf, 0, (len * info->edit_list->audio_bps)); - uint8_t *tmp_buf; - int alen = 0; - int n_frames = (top_speed < 0 ? -1 * top_speed : top_speed); - int i; - int n_samples = 0; - int blen = 0; - int bps = info->edit_list->audio_bps; - double fl,cl; - int pred_len = 0; - tmp_buf = (uint8_t*) vj_malloc(sizeof(uint8_t) * n_frames * PERFORM_AUDIO_SIZE); - if(!tmp_buf) return 0; - - if(n_frames >= MAX_SPEED) n_frames = MAX_SPEED-1; - - for ( i = 0; i <= n_frames; i ++ ) + if (speed > 1 || speed < -1) { - alen = vj_el_get_audio_frame(info->edit_list,settings->current_frame_num + i, tmp_buf + blen); - if( alen < 0 ) return 0; - n_samples += alen; - blen += (alen * bps); - } + int a_len = 0; + int n_frames = abs(speed); +// uint8_t *tmp = audio_render_buffer + (2 * PERFORM_AUDIO_SIZE * MAX_SPEED); +// uint8_t *tmp = audio_render_buffer; + uint8_t *tmp = temporary_buffer; + uint8_t *sambuf = tmp; + long i,start,end; + int total_len = 0; + int n_samples = 0; + if( n_frames >= MAX_SPEED ) + n_frames = MAX_SPEED - 1; - fl = floor( n_samples - n_frames ); - cl = ceil( n_samples + n_frames ); - if( n_samples > 0 ) - { - pred_len = info->edit_list->audio_rate / info->edit_list->video_fps; - len = audio_resample( resample_context[n_frames], audio_buf, tmp_buf, n_samples ); - if( len < pred_len ) + if( speed < 0 ) { - veejay_memset(audio_buf + (len * bps), 0 , (pred_len-len)*bps); + start = settings->current_frame_num - n_frames; + end = settings->current_frame_num; } + else + { + start = settings->current_frame_num; + end = settings->current_frame_num + n_frames; + } + + for ( i = start; i < end; i ++ ) + { + a_len = vj_el_get_audio_frame(info->edit_list,i, tmp); + if( a_len <= 0 ) + { + n_samples += pred_len; + veejay_memset( tmp, 0, pred_len * bps ); + tmp += (pred_len*bps); + total_len += (pred_len*bps); + } + else + { + n_samples += a_len; + total_len += (a_len * bps); + tmp += (a_len* bps ); + } + } +#ifdef STRICT_CHECKING + assert( resample_context[ n_frames ] != NULL ); +#endif + if( speed < 0 ) + vj_perform_reverse_audio_frame(info, n_samples, sambuf ); + + len = audio_resample( resample_context[n_frames-2], audio_buf, sambuf, n_samples ); + + } else if( speed == 0 ) { + len = pred_len; + veejay_memset( audio_buf, 0, pred_len * bps ); + } else { + len = vj_el_get_audio_frame( info->edit_list, settings->current_frame_num, audio_buf ); + if( speed < 0 ) + vj_perform_reverse_audio_frame(info,len,audio_buf); } - if(tmp_buf) free(tmp_buf); - } - else + if( len < pred_len ) + veejay_memset( audio_buf + (len * bps ) , 0, (pred_len- len) * bps ); + } + + if( simple_frame_duplicator <= info->sfd && info->sfd > 1) { - if (top_speed == 0) + if( simple_frame_duplicator == 0 ) { - len = info->edit_list->audio_rate / info->edit_list->video_fps; - veejay_memset(audio_buf, 0, (len * info->edit_list->audio_bps)); - return len; + // @ resample buffer + int down_sample = audio_resample( downsample_context[ info->sfd-2 ], + down_sample_buffer, audio_buf, len ); + veejay_memcpy( audio_buf, down_sample_buffer, pred_len * bps ); } else { - len = - vj_el_get_audio_frame(info->edit_list, - settings->current_frame_num, - audio_buf); + veejay_memcpy( audio_buf, down_sample_buffer + (simple_frame_duplicator * pred_len * bps ), pred_len * bps ); } - } - - if (len <= 0) - { - veejay_memset(audio_buf,0,PERFORM_AUDIO_SIZE); - return (info->edit_list->audio_rate / info->edit_list->video_fps); } - if (top_speed < 0) - vj_perform_reverse_audio_frame(info, len, audio_buf); - - return len; + if( len < pred_len ) + len = pred_len; + return len; } static int vj_perform_apply_secundary_tag(veejay_t * info, int sample_id, @@ -2348,12 +2357,12 @@ static int vj_perform_tag_complete_buffers(veejay_t * info, int entry, int *hint static void vj_perform_plain_fill_buffer(veejay_t * info, int entry) { - video_playback_setup *settings = (video_playback_setup*) info->settings; - uint8_t *frame[3]; - int ret = 0; - frame[0] = primary_buffer[0]->Y; - frame[1] = primary_buffer[0]->Cb; - frame[2] = primary_buffer[0]->Cr; + video_playback_setup *settings = (video_playback_setup*) info->settings; + uint8_t *frame[3]; + int ret = 0; + frame[0] = primary_buffer[0]->Y; + frame[1] = primary_buffer[0]->Cb; + frame[2] = primary_buffer[0]->Cr; if(info->uc->playback_mode == VJ_PLAYBACK_MODE_SAMPLE) { @@ -2364,42 +2373,36 @@ static void vj_perform_plain_fill_buffer(veejay_t * info, int entry) ret = vj_el_get_video_frame(info->current_edit_list,settings->current_frame_num,frame); } - if(ret <= 0) - { - veejay_msg(0, "getting video frame. Stop veejay"); + if(ret <= 0) + { + veejay_msg(0, "Unable to queue video frae %d, stopping Veejay", + settings->current_frame_num ); veejay_change_state_save(info, LAVPLAY_STATE_STOP); - } + } } - -static long last_rendered_frame = 0; static int vj_perform_render_sample_frame(veejay_t *info, uint8_t *frame[3]) { int audio_len = 0; //uint8_t buf[16384]; long nframe = info->settings->current_frame_num; - uint8_t *_audio_buffer = NULL; - if(last_rendered_frame == nframe) return 0; // skip frame - - last_rendered_frame = info->settings->current_frame_num; + uint8_t *buf = (uint8_t*) vj_malloc( sizeof(uint8_t) * PERFORM_AUDIO_SIZE ); - if(info->edit_list->has_audio) - { - _audio_buffer = x_audio_buffer; - audio_len = (info->edit_list->audio_rate / info->edit_list->video_fps); - } - return(int)sample_record_frame( info->uc->sample_id,frame, - _audio_buffer,audio_len); + audio_len = vj_perform_fill_audio_buffers(info, buf, audio_render_buffer ); + int res = sample_record_frame( info->uc->sample_id,frame,buf,audio_len ); + + free(buf); + + return res; } + static int vj_perform_render_tag_frame(veejay_t *info, uint8_t *frame[3]) { long nframe = info->settings->current_frame_num; int sample_id = info->uc->sample_id; - if(last_rendered_frame == nframe) return 0; // skip frame - last_rendered_frame = info->settings->current_frame_num; if(info->settings->offline_record) sample_id = info->settings->offline_tag_id; @@ -2683,7 +2686,7 @@ static int vj_perform_tag_fill_buffer(veejay_t * info, int entry) /* vj_perform_pre_fade: prior to fading, we copy the orginal (unaffected) image to a tempory buffer */ -static inline void vj_perform_pre_chain(veejay_t *info, VJFrame *frame) +static void vj_perform_pre_chain(veejay_t *info, VJFrame *frame) { veejay_memcpy( temp_buffer[0] ,frame->data[0], frame->len ); veejay_memcpy( temp_buffer[1], frame->data[1], frame->uv_len); @@ -2817,88 +2820,80 @@ static void vj_perform_post_chain_tag(veejay_t *info, VJFrame *frame) int vj_perform_queue_audio_frame(veejay_t *info, int frame) { - if( info->audio == NO_AUDIO || !top_audio_buffer ) + if( info->audio == NO_AUDIO || !info->edit_list->has_audio) return 1; #ifdef HAVE_JACK + editlist *el = info->edit_list; video_playback_setup *settings = info->settings; long this_frame = settings->current_frame_num; - int num_samples = 0; - - editlist *el = info->edit_list; + int num_samples = (el->audio_rate/el->video_fps); + int grab_samples = 0; + int bps = el->audio_bps; uint8_t *a_buf = top_audio_buffer; - if(el->has_audio == 0 ) return 1; - - /* First, get the audio */ - if (info->audio == AUDIO_PLAY && el->has_audio) + if (info->audio == AUDIO_PLAY) { if(settings->audio_mute) - veejay_memset( a_buf, 0, num_samples * el->audio_bps); - else { - switch (info->uc->playback_mode) - { - case VJ_PLAYBACK_MODE_SAMPLE: - num_samples = vj_perform_fill_audio_buffers(info,a_buf); - break; + veejay_memset( a_buf, 0, num_samples * bps); + vj_jack_play( a_buf, num_samples * bps ); + return 1; + } - case VJ_PLAYBACK_MODE_PLAIN: + switch (info->uc->playback_mode) + { + case VJ_PLAYBACK_MODE_SAMPLE: + num_samples = vj_perform_fill_audio_buffers(info,a_buf, + audio_render_buffer + (2* PERFORM_AUDIO_SIZE * MAX_SPEED)); + break; + case VJ_PLAYBACK_MODE_PLAIN: if (settings->current_playback_speed == 0) { - veejay_memset( a_buf, 0, PERFORM_AUDIO_SIZE); - num_samples = (el->audio_rate/el->video_fps); + veejay_memset( a_buf, 0, num_samples * bps ); } else { - num_samples = + grab_samples = vj_el_get_audio_frame(el, this_frame,a_buf ); - if(num_samples < 0) - { - veejay_memset(a_buf,0,PERFORM_AUDIO_SIZE); - num_samples = (el->audio_rate/el->video_fps); - } + if(grab_samples < 0) + veejay_memset(a_buf,0,num_samples * bps ); + else + num_samples = grab_samples; } + if (settings->current_playback_speed < 0) vj_perform_reverse_audio_frame(info, num_samples,a_buf); break; - case VJ_PLAYBACK_MODE_TAG: - num_samples = vj_tag_get_audio_frame(info->uc->sample_id, a_buf); - if(num_samples <= 0) - { - veejay_memset( a_buf, 0, PERFORM_AUDIO_SIZE ); - num_samples = (el->audio_rate/el->video_fps); - } + case VJ_PLAYBACK_MODE_TAG: + grab_samples = vj_tag_get_audio_frame(info->uc->sample_id, a_buf); + if(grab_samples <= 0) + veejay_memset( a_buf, 0, num_samples * bps ); + else + num_samples = grab_samples; break; - default: - veejay_memset( a_buf, 0 , PERFORM_AUDIO_SIZE); - break; - } } - /* dump audio frame if required */ - if(info->stream_enabled==1) + + /* dump audio frame if required + if(info->stream_enabled==1) { // FIXME: does this still work ? vj_yuv_put_aframe(a_buf, el, num_samples * el->audio_bps); - } + } */ - if( el->play_rate != el->audio_rate && el->play_rate != 0) + if( jack_rate_ != el->audio_rate) { - veejay_memcpy( x_audio_buffer, a_buf, num_samples * el->audio_bps); - int r = audio_resample( resample_jack, (short*)top_audio_buffer,(short*)a_buf, num_samples ); - vj_jack_play( top_audio_buffer, ( r * el->audio_bps )); + veejay_memcpy( resample_audio_buffer, a_buf, num_samples * bps); + grab_samples = audio_resample( resample_jack, (short*)top_audio_buffer,(short*)a_buf, num_samples ); + vj_jack_play( top_audio_buffer, grab_samples * bps ); } else { - vj_jack_play( a_buf, (num_samples * el->audio_bps )); + vj_jack_play( a_buf, (num_samples * bps )); } } - #endif - return 1; - - } static int vj_perform_render_viewport( veejay_t *info, video_playback_setup *settings ) @@ -3118,15 +3113,15 @@ int vj_perform_queue_video_frame(veejay_t *info, int frame, const int skip_incr) { video_playback_setup *settings = info->settings; - if(settings->offline_record) - vj_perform_record_tag_frame(info,0); - if(skip_incr) return 1; - + int is444 = 0; int res = 0; veejay_memset( &pvar_, 0, sizeof(varcache_t)); + + if(settings->offline_record) + vj_perform_record_tag_frame(info,0); switch (info->uc->playback_mode) { @@ -3204,19 +3199,21 @@ int vj_perform_queue_frame(veejay_t * info, int frame, int skip ) { video_playback_setup *settings = (video_playback_setup*) info->settings; if(!skip) - switch(info->uc->playback_mode) { - case VJ_PLAYBACK_MODE_TAG: - vj_perform_increase_tag_frame(info, settings->current_playback_speed); - break; - case VJ_PLAYBACK_MODE_SAMPLE: - vj_perform_increase_sample_frame(info,settings->current_playback_speed); - break; - case VJ_PLAYBACK_MODE_PLAIN: - vj_perform_increase_plain_frame(info,settings->current_playback_speed); - break; - default: - veejay_change_state(info, LAVPLAY_STATE_STOP); - break; + { + switch(info->uc->playback_mode) + { + case VJ_PLAYBACK_MODE_TAG: + vj_perform_increase_tag_frame(info, settings->current_playback_speed); + break; + case VJ_PLAYBACK_MODE_SAMPLE: + vj_perform_increase_sample_frame(info,settings->current_playback_speed); + break; + case VJ_PLAYBACK_MODE_PLAIN: + vj_perform_increase_plain_frame(info,settings->current_playback_speed); + break; + default: + break; + } } vj_perform_clear_cache(); __global_frame = 0; diff --git a/veejay-current/veejay/vj-perform.h b/veejay-current/veejay/vj-perform.h index c9a5fc64..e4c6ffca 100644 --- a/veejay-current/veejay/vj-perform.h +++ b/veejay-current/veejay/vj-perform.h @@ -31,7 +31,7 @@ int vj_perform_send_primary_frame_s(veejay_t *info, int mcast); void vj_perform_get_primary_frame_420p(veejay_t *info, uint8_t **frame ); -int vj_perform_fill_audio_buffers(veejay_t *info, uint8_t *audio_buf); +int vj_perform_fill_audio_buffers(veejay_t *info, uint8_t *audio_buf, uint8_t *temporary_buffer); int vj_perform_tag_decode_buffers(veejay_t * info, int entry); diff --git a/veejay-current/veejay/vj-pjack.c b/veejay-current/veejay/vj-pjack.c index f9c01400..998ff9c2 100644 --- a/veejay-current/veejay/vj-pjack.c +++ b/veejay-current/veejay/vj-pjack.c @@ -69,30 +69,33 @@ int vj_jack_init(editlist *el) bits_per_sample = 16; audio_channels = el->audio_chans; - audio_rate = el->audio_rate; - if( !_vj_jack_start(&driver) ) return ret; + long jack_rate = JACK_GetSampleRate(driver ); + audio_bps = audio_rate * audio_channels; buffer_len = vj_jack_get_space(); - veejay_msg(2,"Jack: %d Hz/ %d Channels %d Bit ", audio_rate, audio_channels,bits_per_sample); + veejay_msg(2,"Jack: %ld, %d Hz/ %d Channels %d Bit ", jack_rate,audio_channels,bits_per_sample); ret = 1; - if( v_rate != audio_rate ) - { - el->play_rate = audio_rate; + if( jack_rate != el->audio_rate ) ret = 2; - } - + //JACK_SetState( driver, PLAYING); return ret; } +int vj_jack_rate() +{ + return JACK_GetSampleRate(driver); +} + + int vj_jack_continue(int speed) { if(speed==0)