Tuesday 15 May 2012

c# - CPU-greedy loop when streaming music -



c# - CPU-greedy loop when streaming music -

to give context, i'm working on opensource alternative desktop spotify client, accessibility @ it's core. you'll see naudio in here.

i'm noticing pretty intense cpu usage playback starts. when paused, cpu high.

i ran visual studio's inbuilt profiler seek , shed lite on resource hogs might occuring. suspected, problem wasin playback manager's streaming loop.

the code profiler flags 1 of sample-rich follows:

const int secondstobuffer = 3; private void getstreaming(object state) { this.fullydownloaded = false; // secondstobuffer integer represent how many seconds should buffer @ 1 time prevent choppy playback on slow connections seek { { if (bufferedwaveprovider == null) { this.bufferedwaveprovider = new bufferedwaveprovider(new waveformat(44100, 2)); this.bufferedwaveprovider.bufferduration = timespan.fromseconds(20); // allow ahead of ourselves logger.writedebug("creating buffered wave provider"); this.gatekeeper.minimumsamplesize = bufferedwaveprovider.waveformat.averagebytespersecond * secondstobuffer; } // bit in particular seems hot point if (bufferedwaveprovider != null && bufferedwaveprovider.bufferlength - bufferedwaveprovider.bufferedbytes < bufferedwaveprovider.waveformat.averagebytespersecond / 4) { logger.writedebug("buffer getting full, taking break"); thread.sleep(500); } // have @ to the lowest degree double buffered sample's size in free space, in case else if (bufferedwaveprovider.bufferlength - bufferedwaveprovider.bufferedbytes > bufferedwaveprovider.waveformat.averagebytespersecond * (secondstobuffer * 2)) { var sample = gatekeeper.read(); if (sample != null) { bufferedwaveprovider.addsamples(sample, 0, sample.length); } } } while (playbackstate != streamingplaybackstate.stopped); logger.writedebug("playback stopped"); } { // no post-processing work here, right? } }

an naudio sample inspiration way of handling streaming in method. find total file's source code, can view here: http://blindspot.codeplex.com/sourcecontrol/latest#blindspot.playback/playbackmanager.cs

i'm newbie profiling , i'm not year on year expert on streaming either (both might obvious).

is there way can create loop less resource intensive. increasing sleep amount in if block buffer total help? or barking wrong tree here. seems would, i'd have thought half sec sufficient.

any help gratefully received.

basically, you've created infinite loop until buffer gets full. section you've marked with

// bit in particular seems hot point

probably appears calculations in if statement beingness repeated on , on again; can of them moved outside of loop?

i'd set thread.sleep(50) before while statement prevent thrashing , see if makes difference (i suspect will).

c# performance audio-streaming

No comments:

Post a Comment