Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (3)
  • Thomas Guillem's avatar
    audiotrack: remove WRITE_BYTEBUFFER method · ccd3eaae
    Thomas Guillem authored and Steve Lhomme's avatar Steve Lhomme committed
    It was only used with Android API 21 and 22 (Android 5.x).
    Remove this code that behave differently than all other write methods
    and that is not as tested as the others.
    ccd3eaae
  • Thomas Guillem's avatar
    audiotrack: fix invalid join in case of clone error · 17e4aee3
    Thomas Guillem authored and Steve Lhomme's avatar Steve Lhomme committed
    17e4aee3
  • Thomas Guillem's avatar
    audiotrack: use a fixed size for the jarray · a235b9dd
    Thomas Guillem authored and Steve Lhomme's avatar Steve Lhomme committed
    Don't try to copy the whole frame to the jarray buffer but copy it chunk
    by chunk (50ms max). Therefore, a same frame can now be used for more
    than one java write.
    
    This fixes the following error and abort when allocating a too big
    jarray (likely when sending a lot of silence to catch up with a playback
    way to early).
    
    E VLC   : [9b14b710/138c] libvlc generic: jarray allocation failed
    E VLC   : [9b14b710/138c] libvlc generic: Write failed: ERROR
    F DEBUG : Abort message: 'art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: JNI GetJavaVM called with pending exception java.lang.OutOfMemoryError: Failed to allocate a 99591132 byte allocation with 3792244 free bytes and 90MB until OOM'
    a235b9dd
......@@ -47,6 +47,8 @@
#define TIMING_REPORT_DELAY_TICKS VLC_TICK_FROM_MS(1000)
#define JARRAY_SIZE_US VLC_TICK_FROM_MS(50)
typedef struct
{
jobject p_audiotrack; /* AudioTrack ref */
......@@ -87,7 +89,6 @@ typedef struct
WRITE_BYTEARRAY,
WRITE_BYTEARRAYV23,
WRITE_SHORTARRAYV23,
WRITE_BYTEBUFFER,
WRITE_FLOATARRAY
} i_write_type;
......@@ -904,11 +905,18 @@ AudioTrack_Create( JNIEnv *env, aout_stream_t *stream,
}
static void
AudioTrack_ConsumeFrame(aout_stream_t *stream, vlc_frame_t *f)
AudioTrack_ConsumeFrame(aout_stream_t *stream, vlc_frame_t *f, size_t size)
{
aout_sys_t *p_sys = stream->sys;
assert(f != NULL && f == p_sys->frame_chain);
f->i_buffer -= size;
if (f->i_buffer > 0)
{
f->p_buffer += size;
return;
}
p_sys->frame_chain = f->p_next;
if (p_sys->frame_chain == NULL)
p_sys->frame_last = &p_sys->frame_chain;
......@@ -917,28 +925,24 @@ AudioTrack_ConsumeFrame(aout_stream_t *stream, vlc_frame_t *f)
}
static int
AudioTrack_AllocJArray(JNIEnv *env, aout_stream_t *stream, size_t size,
AudioTrack_AllocJArray(JNIEnv *env, aout_stream_t *stream, unsigned sample_size,
jarray (*new)(JNIEnv *env, jsize size))
{
aout_sys_t *p_sys = stream->sys;
if (size > p_sys->jbuffer.maxsize)
{
p_sys->jbuffer.maxsize = 0;
if (p_sys->jbuffer.array != NULL)
(*env)->DeleteLocalRef(env, p_sys->jbuffer.array);
size_t size = US_TO_BYTES(JARRAY_SIZE_US) / sample_size;
p_sys->jbuffer.array = new(env, size);
if (p_sys->jbuffer.array != NULL)
p_sys->jbuffer.maxsize = size;
else
msg_Err(stream, "jarray allocation failed");
}
jobject array = new(env, size);
if (array == NULL)
return jfields.AudioTrack.ERROR;
p_sys->jbuffer.array = (*env)->NewGlobalRef(env, array);
(*env)->DeleteLocalRef(env, array);
if (p_sys->jbuffer.array == NULL)
return jfields.AudioTrack.ERROR;
p_sys->jbuffer.size = size;
p_sys->jbuffer.maxsize = size;
p_sys->jbuffer.size = 0;
p_sys->jbuffer.offset = 0;
return 0;
......@@ -956,21 +960,23 @@ AudioTrack_WriteByteArray( JNIEnv *env, aout_stream_t *stream, bool b_force )
uint64_t i_samples;
uint64_t i_audiotrack_pos;
uint64_t i_samples_pending;
int ret;
if (p_sys->jbuffer.offset == p_sys->jbuffer.size)
if (p_sys->jbuffer.size == 0)
{
vlc_frame_t *f = p_sys->frame_chain;
assert(f != NULL);
ret = AudioTrack_AllocJArray(env, stream, f->i_buffer,
(*env)->NewByteArray);
if (ret != 0)
return ret;
(*env)->SetByteArrayRegion(env, p_sys->jbuffer.array,
0, f->i_buffer, (jbyte *)f->p_buffer);
AudioTrack_ConsumeFrame(stream, f);
size_t size = f->i_buffer > p_sys->jbuffer.maxsize ?
p_sys->jbuffer.maxsize : f->i_buffer;
p_sys->jbuffer.size = size;
p_sys->jbuffer.offset = 0;
(*env)->SetByteArrayRegion(env, p_sys->jbuffer.array, 0,
size, (jbyte *)f->p_buffer);
AudioTrack_ConsumeFrame(stream, f, size);
}
assert(p_sys->jbuffer.size > 0);
assert(p_sys->jbuffer.size > p_sys->jbuffer.offset);
i_audiotrack_pos = AudioTrack_getPlaybackHeadPosition( env, stream );
......@@ -998,7 +1004,11 @@ AudioTrack_WriteByteArray( JNIEnv *env, aout_stream_t *stream, bool b_force )
ret = JNI_AT_CALL_INT( write, p_sys->jbuffer.array, p_sys->jbuffer.offset,
FRAMES_TO_BYTES( i_samples ) );
if (ret > 0)
{
p_sys->jbuffer.offset += ret;
if (p_sys->jbuffer.offset == p_sys->jbuffer.size)
p_sys->jbuffer.size = 0;
}
return ret;
}
......@@ -1012,73 +1022,33 @@ static int
AudioTrack_WriteByteArrayV23(JNIEnv *env, aout_stream_t *stream)
{
aout_sys_t *p_sys = stream->sys;
int ret;
if (p_sys->jbuffer.offset == p_sys->jbuffer.size)
if (p_sys->jbuffer.size == 0)
{
vlc_frame_t *f = p_sys->frame_chain;
assert(f != NULL);
ret = AudioTrack_AllocJArray(env, stream, f->i_buffer,
(*env)->NewByteArray);
if (ret != 0)
return ret;
(*env)->SetByteArrayRegion(env, p_sys->jbuffer.array,
0, f->i_buffer, (jbyte *)f->p_buffer);
AudioTrack_ConsumeFrame(stream, f);
size_t size = f->i_buffer > p_sys->jbuffer.maxsize ?
p_sys->jbuffer.maxsize : f->i_buffer;
p_sys->jbuffer.size = size;
p_sys->jbuffer.offset = 0;
(*env)->SetByteArrayRegion(env, p_sys->jbuffer.array, 0,
size, (jbyte *)f->p_buffer);
AudioTrack_ConsumeFrame(stream, f, size);
}
assert(p_sys->jbuffer.size > 0);
assert(p_sys->jbuffer.size > p_sys->jbuffer.offset);
ret = JNI_AT_CALL_INT( writeV23, p_sys->jbuffer.array,
p_sys->jbuffer.offset,
p_sys->jbuffer.size - p_sys->jbuffer.offset,
jfields.AudioTrack.WRITE_NON_BLOCKING );
if (ret > 0)
p_sys->jbuffer.offset += ret;
return ret;
}
/**
* Non blocking play function for Lollipop and after, run from
* AudioTrack_Thread. It calls a new write method with WRITE_NON_BLOCKING
* flags.
*/
static int
AudioTrack_WriteByteBuffer(JNIEnv *env, aout_stream_t *stream)
{
aout_sys_t *p_sys = stream->sys;
if (p_sys->jbuffer.offset == p_sys->jbuffer.size)
{
vlc_frame_t *f = p_sys->frame_chain;
assert(f != NULL);
if (p_sys->jbuffer.array != NULL)
(*env)->DeleteLocalRef(env, p_sys->jbuffer.array);
p_sys->jbuffer.array = (*env)->NewDirectByteBuffer(env,
f->p_buffer,
f->i_buffer);
if (p_sys->jbuffer.array == NULL)
{
if ((*env)->ExceptionCheck(env))
(*env)->ExceptionClear(env);
return jfields.AudioTrack.ERROR;
}
p_sys->jbuffer.offset = 0;
p_sys->jbuffer.size = f->i_buffer;
/* Don't take account of the current frame for the delay */
f->i_buffer = 0;
}
int ret = JNI_AT_CALL_INT(writeBufferV21, p_sys->jbuffer.array,
p_sys->jbuffer.size - p_sys->jbuffer.offset,
jfields.AudioTrack.WRITE_NON_BLOCKING);
if (ret > 0)
{
p_sys->jbuffer.offset += ret;
/* The ByteBuffer reference directly the data from the frame, so it
* should stay allocated until all the data is written */
if (p_sys->jbuffer.offset == p_sys->jbuffer.size)
AudioTrack_ConsumeFrame(stream, p_sys->frame_chain);
p_sys->jbuffer.size = 0;
}
return ret;
......@@ -1093,21 +1063,24 @@ static int
AudioTrack_WriteShortArrayV23(JNIEnv *env, aout_stream_t *stream)
{
aout_sys_t *p_sys = stream->sys;
int ret;
if (p_sys->jbuffer.offset == p_sys->jbuffer.size)
if (p_sys->jbuffer.size == 0)
{
vlc_frame_t *f = p_sys->frame_chain;
assert(f != NULL);
ret = AudioTrack_AllocJArray(env, stream, f->i_buffer / 2,
(*env)->NewShortArray);
if (ret != 0)
return ret;
(*env)->SetShortArrayRegion(env, p_sys->jbuffer.array,
0, f->i_buffer / 2, (jshort *)f->p_buffer);
AudioTrack_ConsumeFrame(stream, f);
size_t buffer_size_short = f->i_buffer / 2;
size_t size = buffer_size_short > p_sys->jbuffer.maxsize ?
p_sys->jbuffer.maxsize : buffer_size_short;
p_sys->jbuffer.size = size;
p_sys->jbuffer.offset = 0;
(*env)->SetShortArrayRegion(env, p_sys->jbuffer.array, 0,
size, (jshort *)f->p_buffer);
AudioTrack_ConsumeFrame(stream, f, size * 2);
}
assert(p_sys->jbuffer.size > 0);
assert(p_sys->jbuffer.size > p_sys->jbuffer.offset);
ret = JNI_AT_CALL_INT( writeShortV23, p_sys->jbuffer.array,
p_sys->jbuffer.offset,
......@@ -1116,6 +1089,8 @@ AudioTrack_WriteShortArrayV23(JNIEnv *env, aout_stream_t *stream)
if (ret > 0)
{
p_sys->jbuffer.offset += ret;
if (p_sys->jbuffer.offset == p_sys->jbuffer.size)
p_sys->jbuffer.size = 0;
ret *= 2;
}
......@@ -1133,28 +1108,32 @@ AudioTrack_WriteFloatArray(JNIEnv *env, aout_stream_t *stream)
aout_sys_t *p_sys = stream->sys;
int ret;
if (p_sys->jbuffer.offset == p_sys->jbuffer.size)
if (p_sys->jbuffer.size == 0)
{
vlc_frame_t *f = p_sys->frame_chain;
assert(f != NULL);
ret = AudioTrack_AllocJArray(env, stream, f->i_buffer / 4,
(*env)->NewFloatArray);
if (ret != 0)
return ret;
(*env)->SetFloatArrayRegion(env, p_sys->jbuffer.array,
0, f->i_buffer / 4, (jfloat *)f->p_buffer);
AudioTrack_ConsumeFrame(stream, f);
size_t buffer_size_float = f->i_buffer / 4;
size_t size = buffer_size_float > p_sys->jbuffer.maxsize ?
p_sys->jbuffer.maxsize : buffer_size_float;
p_sys->jbuffer.size = size;
p_sys->jbuffer.offset = 0;
(*env)->SetFloatArrayRegion(env, p_sys->jbuffer.array, 0,
size, (jfloat *)f->p_buffer);
AudioTrack_ConsumeFrame(stream, f, size * 4);
}
assert(p_sys->jbuffer.size > 0);
assert(p_sys->jbuffer.size > p_sys->jbuffer.offset);
ret = JNI_AT_CALL_INT(writeFloat, p_sys->jbuffer.array,
p_sys->jbuffer.offset,
p_sys->jbuffer.size - p_sys->jbuffer.offset,
jfields.AudioTrack.WRITE_NON_BLOCKING);
if (ret > 0)
{
p_sys->jbuffer.offset += ret;
if (p_sys->jbuffer.offset == p_sys->jbuffer.size)
p_sys->jbuffer.size = 0;
ret *= 4;
}
......@@ -1172,9 +1151,6 @@ AudioTrack_Write( JNIEnv *env, aout_stream_t *stream, bool b_force )
case WRITE_BYTEARRAYV23:
i_ret = AudioTrack_WriteByteArrayV23(env, stream);
break;
case WRITE_BYTEBUFFER:
i_ret = AudioTrack_WriteByteBuffer(env, stream);
break;
case WRITE_SHORTARRAYV23:
i_ret = AudioTrack_WriteShortArrayV23(env, stream);
break;
......@@ -1291,7 +1267,7 @@ AudioTrack_Thread( void *p_data )
/* Wait for more data in the jbuffer buffer */
while (p_sys->b_thread_running
&& p_sys->jbuffer.offset == p_sys->jbuffer.size
&& p_sys->jbuffer.size == 0
&& p_sys->frame_chain == NULL)
vlc_cond_wait( &p_sys->thread_cond, &p_sys->lock );
......@@ -1357,12 +1333,6 @@ AudioTrack_Thread( void *p_data )
vlc_mutex_unlock( &p_sys->lock );
}
if (p_sys->jbuffer.array != NULL)
{
(*env)->DeleteLocalRef(env, p_sys->jbuffer.array);
p_sys->jbuffer.array = NULL;
}
return NULL;
}
......@@ -1815,6 +1785,9 @@ Stop( aout_stream_t *stream )
else
vlc_mutex_unlock( &p_sys->lock );
if (p_sys->jbuffer.array != NULL)
(*env)->DeleteGlobalRef(env, p_sys->jbuffer.array);
/* Release the AudioTrack object */
if( p_sys->p_audiotrack )
{
......@@ -1869,6 +1842,7 @@ Start( aout_stream_t *stream, audio_sample_format_t *restrict p_fmt,
vlc_mutex_init(&p_sys->lock);
vlc_cond_init(&p_sys->thread_cond);
p_sys->jbuffer.array = NULL;
p_sys->volume = 1.0f;
p_sys->mute = false;
......@@ -1918,9 +1892,6 @@ Start( aout_stream_t *stream, audio_sample_format_t *restrict p_fmt,
goto error;
}
p_sys->jbuffer.array = NULL;
p_sys->jbuffer.size = p_sys->jbuffer.offset = 0;
p_sys->jbuffer.maxsize = 0;
p_sys->frame_chain = NULL;
p_sys->frame_last = &p_sys->frame_chain;
AudioTrack_Reset( env, stream );
......@@ -1929,27 +1900,32 @@ Start( aout_stream_t *stream, audio_sample_format_t *restrict p_fmt,
{
msg_Dbg( stream, "using WRITE_FLOATARRAY");
p_sys->i_write_type = WRITE_FLOATARRAY;
i_ret = AudioTrack_AllocJArray(env, stream, 4, (*env)->NewFloatArray);
}
else if( p_sys->fmt.i_format == VLC_CODEC_SPDIFL )
{
assert( jfields.AudioFormat.has_ENCODING_IEC61937 );
msg_Dbg( stream, "using WRITE_SHORTARRAYV23");
p_sys->i_write_type = WRITE_SHORTARRAYV23;
i_ret = AudioTrack_AllocJArray(env, stream, 2, (*env)->NewShortArray);
}
else if( jfields.AudioTrack.writeV23 )
{
msg_Dbg( stream, "using WRITE_BYTEARRAYV23");
p_sys->i_write_type = WRITE_BYTEARRAYV23;
}
else if( jfields.AudioTrack.writeBufferV21 )
{
msg_Dbg( stream, "using WRITE_BYTEBUFFER");
p_sys->i_write_type = WRITE_BYTEBUFFER;
i_ret = AudioTrack_AllocJArray(env, stream, 1, (*env)->NewByteArray);
}
else
{
msg_Dbg( stream, "using WRITE_BYTEARRAY");
p_sys->i_write_type = WRITE_BYTEARRAY;
i_ret = AudioTrack_AllocJArray(env, stream, 1, (*env)->NewByteArray);
}
if (i_ret != 0)
{
msg_Err(stream, "jbuffer allocation failed");
goto error;
}
/* Run AudioTrack_Thread */
......@@ -1957,6 +1933,7 @@ Start( aout_stream_t *stream, audio_sample_format_t *restrict p_fmt,
p_sys->b_thread_paused = false;
if ( vlc_clone( &p_sys->thread, AudioTrack_Thread, stream ) )
{
p_sys->b_thread_running = false;
msg_Err(stream, "vlc clone failed");
goto error;
}
......