Dealing with a WMP10 Hang when syncing

Since I'm busting hump to try get get all the work done that I need to before the extended weekend (which I super-sized by taking vacation Friday and Tuesday), I need to keep this short, but given about 30 minutes of scouring newgroups turned this up as a common problem, I felt the need to get this out.

I lost my Audiovox SMT5600 last week. Best I can tell it fell out of my pocket while on a flight to visit a new customer and as of yet, Delta hasn’t found it.  It’s my own fault since I didn’t notice until I hopped into the rental car.  Along with the phone went my miniSD car with a bunch of tunage on it.  I bought a new 5600 and got it on Monday, and took the opportunity to upgrade to a 1G miniSD car (one freakin’ gig in my phone!  It still blows me away).  As I was trying to load my the hew car using Windows Media Player 10’s sync function, I’d see it start the conversion, sit at “Converting (0%)” for ever and the fan in my laptop would kick it into high gear to keep the pegged CPU from burning a hole in my desk.  Process explorer told me wmpenc.exe was the culprit.

After a quick search of various incantations of wmpenc, wmp10, and sync, I finally got some hints in the microsoft.public.windowsmedia.player newsgroup.  There were a ton of posts of people seeing the same thing.  WMP10 set up to transcode files when syncing to a device would spawn wmpenc and that would in turn peg the CPU when trying to convert a MP3 file.  Having just spend the yesterday at a customer going over user mode debugging, I broke out ADPlus and took a hang dump of the process.  !runaway showed me the suspect thread, and the callstack for that thread looked like this (ignore that I don’t have symbols lined up completely):

0:000> kb
ChildEBP RetAddr Args to Child
0007dde8 03e154d3 03e30000 00000101 085a0020 ntdll!RtlReAllocateHeap+0xc36
WARNING: Stack unwind information not available. Following frames may be wrong.
0007de30 03e11283 085a0020 01e46000 03e31fc8 aac_parser!DllGetClassObject+0xb8a
0007de70 03e110c1 00791400 03e32080 03e320a0 aac_parser+0x1283
0007de98 03e11ca4 0003f6a8 0003f6bc 03e32118 aac_parser+0x10c1
0007decc 7483d814 03e321b4 00000000 001214e0 aac_parser!DllUnregisterServer+0x4c2
0007deec 7483e05f 03e32124 001214e0 0003f6b0 quartz!CBasePin::AttemptConnection+0x54
0007df10 7483dbf7 03e32124 00000000 001214e0 quartz!CBasePin::TryMediaTypes+0x64
0007df3c 7483db81 03e32124 00000000 0003ea20 quartz!CBasePin::AgreeMediaType+0x73
0007df54 7483d8d0 0003f5f4 03e32124 00000000 quartz!CBasePin::Connect+0x55
0007df80 74871cfe 0003f6bc 03e32124 00000000 quartz!CFilterGraph::ConnectDirectInternal+0x40
0007dfb4 74871f79 0003f6bc 0003fd7c 00000000 quartz!CFilterGraph::ConnectByFindingPin+0x76
0007e1fc 748720af 0003f6bc 0003fd7c 00000000 quartz!CFilterGraph::ConnectUsingFilter+0x173
0007e28c 748721a3 0003f6bc 0003fd7c 00000000 quartz!CFilterGraph::ConnectViaIntermediate+0x10e
0007e2b4 7487226e 0003f6bc 80040207 00000000 quartz!CFilterGraph::ConnectRecursively+0x88
0007e2dc 7487249a 0003f6bc 0003eabc 00000000 quartz!CFilterGraph::ConnectInternal+0x9b
0007e2f4 07c1e91b 0003ea20 0003f6bc 0003fd7c quartz!CFilterGraph::Connect+0x17
0007e470 07c1f077 0007e4c4 0007e500 0003f7b0 wmpsrcwp!CWMEncSourceWrapper::AutoGraphBuilder+0x1b4
0007e4ac 07c1fad0 e436eb83 11ce524f 2000539f wmpsrcwp!CWMEncSourceWrapper::CreateAndConnectFilters+0xa5
0007e524 07c1fbb0 0003e198 0003ea20 00000000 wmpsrcwp!CWMEncSourceWrapper::CreateFileSource+0xa2
0007e53c 07c15cc1 0007e7b0 0007e5a8 77c467bd wmpsrcwp!CWMEncSourceWrapper::SetName+0xc1

aac_parser?  This was an MP3 file, not AAC.  The file information for showed it to be a DirectShow filter.  I don’t know a ton about DirectShow but judging from the callstack, it looked like wmpenc was still searching for a filter to perform the transcode with and got stuck on the AAC filter.  Another quick search turned up this tool for managing DirectShow filters (I’m sure there is a better way to do this, but as I mentioned I was under the gun and already spent too much time troubleshooting this).  I yanked the AAC filter out and re-retried the file sync in WMP10.  Bingo!  The conversion and copy went along as planned.

I suppose I need to track down why aac_parser is busticated but that is for another day – its back to work for me so we can hit the road as early as possible.