<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>16.7ms in the life</title><link>http://blogs.msdn.com/peterrosser/default.aspx</link><description>A sample in the life of a Media Center developer</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>&lt;Invoke Target="[Blog.Entries.Add]" item="[NewPosting]" InvokePolicy="Synchronous" ExclusiveApply="true" /&gt;</title><link>http://blogs.msdn.com/peterrosser/archive/2007/03/20/lt-invoke-target-blog-entries-add-item-newposting-invokepolicy-synchronous-exclusiveapply-true-gt.aspx</link><pubDate>Wed, 21 Mar 2007 07:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1923234</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/1923234.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=1923234</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=1923234</wfw:comment><description>&lt;P&gt;So, the last several months have been fairly busy, what with Vista shipping (woohoo!), vacations, and plannng the next rev. I worked long hours alongside my fellow eHomers, we shipped, and I took off a couple of months to find myself in Mexico and decompress. I've been back for a while now, and been bugged enough about my blog neglect--so here I am posting again.&lt;/P&gt;
&lt;P&gt;The timbre of my postings will probably shift quite a bit now that I am in a new position on a new team. As of February, I have left the Windows TV team and joined the Media Center Core, a move that shifts me from the south side of building 50 to the north side, across the Great Divide of the central hallway. That is, when my office move happens to place me somewhat closer to my new team. It's always a little melancholy moving teams, but I am excited at the new opportunities I have to make a&amp;nbsp;positive&amp;nbsp;impact on the product.&lt;/P&gt;
&lt;P&gt;The Media Center Core Team owns the Media Center application, non-TV experiences: Movies Guide, music, photos &amp;amp;&amp;nbsp;video library, extensibility, online spotlight, and a bunch of other stuff on the side. It's always difficult to talk about what we do without talking about what we're &lt;STRONG&gt;doing&lt;/STRONG&gt;, if you get my meaning.&lt;/P&gt;
&lt;P&gt;One thing I &lt;STRONG&gt;can&lt;/STRONG&gt; talk about is that we are growing, and with growing comes new jobs! We have several positions open for experienced developers posted on the Microsoft job site (here's one: &lt;A href="http://members.microsoft.com/careers/search/details.aspx?JobID=9D2139A0-0D36-414E-8C66-B3C8CFD35086" mce_href="http://members.microsoft.com/careers/search/details.aspx?JobID=9D2139A0-0D36-414E-8C66-B3C8CFD35086"&gt;http://members.microsoft.com/careers/search/details.aspx?JobID=9D2139A0-0D36-414E-8C66-B3C8CFD35086&lt;/A&gt;&amp;nbsp;). If you think you have what it takes to help us ship the coolest feature in Windows to millions of users, send me your resume! Whether your passion is TV, music, photos, or you're just a scary-smart engineer, we are hiring across the board, for Test, Development, and Program Management.&lt;/P&gt;
&lt;P&gt;Oh, if anyone has anything in particular they'd like me to talk about, shoot me an email (&lt;A href="mailto:peter.rosser@microsoft.com" mce_href="mailto:peter.rosser@microsoft.com"&gt;peter.rosser@microsoft.com&lt;/A&gt;) or add a comment.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1923234" width="1" height="1"&gt;</description></item><item><title>Thoughts on software complexity</title><link>http://blogs.msdn.com/peterrosser/archive/2006/06/02/SoftwareComplexity.aspx</link><pubDate>Sat, 03 Jun 2006 07:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:615591</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/615591.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=615591</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=615591</wfw:comment><description>&lt;P&gt;If you've ever tried to create a software application of any decent size, you have probably realized that what works with small tools more often than not does not scale well to larger sizes.&amp;nbsp; There are whole books written about how to scale up and out, new languages and technologies invented to help manage it, and millions of dollars in educational budgets spent every year to achieve that elusive goal.&lt;/P&gt;
&lt;P&gt;And yet, the landscape is still rife with examples of poorly designed software.&lt;/P&gt;
&lt;P&gt;A significant part of the&amp;nbsp;problem is not that engineers are not smart enough--it's that we outsmart ourselves.&amp;nbsp; The conventional wisdom is that humans can store 7 ± 2 primitives (e.g. numbers) on the top stack of short-term memory.&amp;nbsp; The number skews higher for strongly associative items, and vice versa.&amp;nbsp; We can store fewer abstract items, often only 2 or 3 at a time.&amp;nbsp; The issue is not one of comprehension, it's one of focused retension.&amp;nbsp; When the number of data items in a class exceeds our capacity to retain them at once, the brain tends to move the perceived "less important" fields/properties into peripheral storage.&amp;nbsp; This, I think, leads to not fully comprehending the interactions in the class.&amp;nbsp; We engineers like to think of ourselves as intelligent, and that we can understand very complex ideas.&amp;nbsp; This may be true, but it misses the point; the point of software engineering is to create&amp;nbsp;reliable, performant, maintainable software.&amp;nbsp; It is &lt;EM&gt;not&lt;/EM&gt; to create complex applications.&lt;/P&gt;
&lt;P&gt;Well, there's the problem, isn't it?&amp;nbsp; In order to create the really cool applications, you must have complexity.&amp;nbsp; It's simply unavoidable, especially given the advanced competition for consumer dollars.&amp;nbsp; You can't very well create a next generation RPG that has realistic physics, with a "real" economy, kickass graphics and brutally smart AI without complexity.&lt;/P&gt;
&lt;P&gt;Or can you?&lt;/P&gt;
&lt;P&gt;Actually, I believe the answer is that you can, at least the bad kind of complexity that causes the pain.&amp;nbsp;The key is differentiating between behavioral complexity and system complexity.&amp;nbsp; Behavioral complexity is the aforementioned features like smart AI, or realistic physics.&amp;nbsp; Those sorts of things are monstrously difficult to get right, but that's not what holds back the very large application development projects.&amp;nbsp; The major cause for schedule slips, regressions, out-and-out bugs, and general angst is system complexity.&lt;/P&gt;
&lt;P&gt;Before I go on, I'd like to define what I mean (yes, I do get to hijack words like this) by&amp;nbsp;system complexity: &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #f5f5dc"&gt;System complexity a property of a system that&amp;nbsp;is directly proportional to the difficulty one has&amp;nbsp;in&amp;nbsp;comprehending&amp;nbsp;the system&amp;nbsp;at the level and detail necessary to make changes to the system without introducing instability or functional regressions. &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;In other words, the higher the system complexity, the harder it is to upgrade, maintain, and&amp;nbsp;develop the system.&amp;nbsp;Whether the system is a single class, an object library, an inheritance heirarchy, or an entire application, someone "schooled in the art" of software engineering should be able to understand it, given a reasonable time to examine the system.&amp;nbsp; This ability should &lt;EM&gt;scale through the system.&lt;/EM&gt;&amp;nbsp; When one examines a particular object, it should be apparent without examining the private implementation details how to use it.&amp;nbsp; From top to bottom, from bottom to top; the entire system should be accessible to the non-super-geniuses out there.&amp;nbsp; What goes for good UI design also goes for good C++, C# and COM design: your target audience should be able to use it without extensive systems training.&lt;/P&gt;
&lt;P&gt;System Complexity is what makes the Mythical Man Month true.&amp;nbsp; It's what keeps that guy who wrote the accounting system from scratch in 1986 employed.&amp;nbsp; It's what causes games, productivity applications, and even (some might say especially) large operating system projects to slip their schedules.&lt;/P&gt;
&lt;P&gt;So what can you do about it?&amp;nbsp; The first step to recovery is admitting you have a problem.&amp;nbsp; Pedantic, but true.&amp;nbsp; Getting back to the point I tried to make earlier about engineers--we like to think we are smart.&amp;nbsp; Egos loom large in the software industry, and often with good reason.&amp;nbsp; One of the smartest developers I have come across worked on a critical piece of the code for several years, and guarded his territory jealously.&amp;nbsp; Make no mistake, this guy was brilliant--and he knew it.&amp;nbsp; To make a long story short, when he left, the code he left behind was an engineering marvel [he says wryly] that no one else understood.&amp;nbsp; Oh, we know what it does, but there's a crucial difference in understanding what something does, and grokking fully how it does it.&amp;nbsp; Tracing execution paths through this code is difficult, and 1200-line methods named "Run" are common.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The author understood it all, or said he did, but my opinion is that he was fooling himself, too.&amp;nbsp;Once you get a piece of the system working, after all, you don't need to touch that piece again unless the design changes, a bug is found, or something like that.&amp;nbsp;Over time, though, people started to notice that even small fixes in this particular area would touch a dozen or more files, and churn lots of code.&amp;nbsp; That's a symptom of high system complexity; he would go in to make the fix, then discover that 100 variables influenced the behavior, or the implementation in one area was strongly dependent on the implementation in another, or most often, both.&amp;nbsp; But since the author had traveled this area so much, he was able to turn around the fixes in an acceptable timeframe, so he "got away" with it.&lt;/P&gt;
&lt;P&gt;It's no surprise that when the author decided to move on to other things, as employees often do, that we had a tough decision to make.&amp;nbsp; Do we maintain this code that's &lt;EM&gt;working&lt;/EM&gt;?&amp;nbsp; Do we refactor?&amp;nbsp; In the end it came down to pragmatism and schedule: the problem was recognized, and we chose to refactor the system in measured stages, minimizing the risk to the product and getting back to a good, maintainable state.&lt;/P&gt;
&lt;P&gt;That's all I have time for today... my build is done, so back to work I go.&amp;nbsp;Windows Vista waits for no man!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=615591" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Coding/default.aspx">Coding</category><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Musing/default.aspx">Musing</category></item><item><title>Where's Peter?</title><link>http://blogs.msdn.com/peterrosser/archive/2006/06/01/613494.aspx</link><pubDate>Fri, 02 Jun 2006 02:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:613494</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/613494.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=613494</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=613494</wfw:comment><description>&lt;P&gt;... working, working, working.&lt;/P&gt;
&lt;P&gt;That, in short, is why there have been no updates in so long.&amp;nbsp; Between my work schedule, family and renovation project I have not had much time to myself.&amp;nbsp; I have neglected my blog in favor of meatspace; sorry!&lt;/P&gt;
&lt;P&gt;When things settle down a bit, I'll blog the drama a bit (what I can). ^_^&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=613494" width="1" height="1"&gt;</description></item><item><title>Media Center Technical Discussion 1: Tuners and TuningSpaces</title><link>http://blogs.msdn.com/peterrosser/archive/2006/04/03/MCE-TechTalk-1.aspx</link><pubDate>Tue, 04 Apr 2006 06:08:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:567832</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>28</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/567832.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=567832</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=567832</wfw:comment><description>&lt;P&gt;The Media Center TV experience driven by a flexible, multi-standard engine that works with any compatible tuner (including a good number of analog tuner cards and all &lt;A href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/htm/bdanetworkprovider.asp"&gt;BDA&lt;/A&gt; digital tuner cards) to create portable recordings viewable on any Windows XP machine.&amp;nbsp; To support “trick play” on Live TV (Pause, FFWD, etc.), the video engine is separated into two main segments: capture and playback.&amp;nbsp; The capture engine, controlled through the Media Center Receiver Service (ehrecvr.exe), is responsible for creating the actual recordings, including controlling tuners, creating a media stream, and optionally encrypting the stream before writing it to disk.&amp;nbsp; The playback engine, controlled through the Media Center Shell (ehshell.exe), processes media streams created by the capture engine and renders them for the user.&amp;nbsp; Everything else, as far as TV goes, is built on top of or leverages these two components.&lt;/P&gt;
&lt;P&gt;The capture engine uses the &lt;A href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/htm/themicrosoftunifiedtuningmodel.asp"&gt;Microsoft Unified Tuning Model&lt;/A&gt;, with &lt;A href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/htm/ituningspaceinterface.asp"&gt;TuningSpaces&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/htm/itunerequestinterface.asp"&gt;TuneRequests&lt;/A&gt;, as a layer on top of the physical tuner, allowing Media Center to treat tuners agnostically.&amp;nbsp; To actually tune to a channel, Media Center first creates (or looks up) a tune request that corresponds to that channel, then submits it to the capture engine, which uses it to tell the tuner what to do. &lt;/P&gt;
&lt;P&gt;A TuningSpace corresponds to code written specifically to handle a type of video broadcast, such as ATSC, NTSC, or DVB-T.&amp;nbsp; Some properties are present in all TuningSpaces, like its ID (e.g. {8A674B4D-1F63-11D3-B64C-00C04F79498E} for NTSC Analog Cable), and some are specific to an implementation.&amp;nbsp; The implementation-specific properties--like NetworkType or DefaultLocator for digital standards--let the capture engine configure the underlying BDA driver, and provide a way to tweak default values.&amp;nbsp; A TuningSpace can be considered a "template" for how Media Center will try to talk to the tuner card, depending on how you have it configured--mapping roughly to the old TV setting of "Antenna" or "Cable".&lt;/P&gt;
&lt;P&gt;All by itself, a TuningSpace is not enough to actually tune to a broadcast stream.&amp;nbsp; For that, Media Center creates a TuneRequest (by using the ITuningSpace object).&amp;nbsp; A TuneRequest can be thought of as "everything you need to know about tuning to a channel"; what it contains varies from TuningSpace to TuningSpace. For an NTSC tune request, you could expect it to contain a channel number and a reference to the TuningSpace; an ATSC tune request would contain a physical channel (the "major" channel) and a minor channel; a DVB-T tune request would contain the broadcast frequency, ONID, TSID, and SID.&amp;nbsp; All tune requests contain a reference back to the proper TuningSpace.&lt;/P&gt;
&lt;P&gt;Media Center stores information about which TuningSpace(s) are configured on the system on a per-tuner basis in the Windows registry under the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Media Center\Service\Video\Tuners key.&amp;nbsp; If you open this key, you'll see something like this:&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://pegasi.com/MCE_TT_1_1.gif" border=0&gt;&lt;/P&gt;
&lt;P&gt;The GUIDs correspond to "tuning categories", which are digital ({71985F48-1CA1-11D3-9CC8-00C04F7971E0}) and analog ({A799A800-A46D-11D0-A18C-00A02401DCD4}), each containing subkeys that correspond to individual tuner devices.&amp;nbsp; Note that there can be more than one tuner device per physical tuner card or USB device--Media Center treats multi-tuner cards as separate devices.&amp;nbsp; I will use my Hauppauge WinTV PVR PCI II device's entry as an example:&lt;/P&gt;
&lt;TABLE border=0&gt;
&lt;TBODY&gt;
&lt;TR vAlign=top&gt;
&lt;TD&gt;&lt;IMG src="http://pegasi.com/MCE_TT_1_2.gif" border=0&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;IMG src="http://pegasi.com/MCE_TT_1_3.gif" border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;As you can see above, the tuner's auto-generated GUID is {99F4E181-4B58-4258-8547-2CE73F3C0386}.&amp;nbsp; This key is created by the ehrecvr service automatically when it detects the tuner: for a PCI card, this happens at service startup; for a USB device, this happens either at service startup or when you plug in the device.&amp;nbsp; If you delete the key and restart the ehrecvr service--and the card is still installed--a key will be created with a new GUID.&amp;nbsp; If a USB device is detached and reattached to a different port it will also get a new key.&lt;/P&gt;
&lt;P&gt;Examining the properties, there are a couple of interesting values:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;I&gt;ConfiguredTuningspace &lt;/I&gt;is a REG_MULTI_SZ that contains a list of the TuningSpace IDs for which this card has been configured in Media Center. 
&lt;LI&gt;&lt;I&gt;SupportedTuningspace &lt;/I&gt;contains a list of the TuningSpace IDs with which the tuner's driver reports compatibility.&amp;nbsp; These lists&lt;I&gt; can&lt;/I&gt; differ if the tuner supports more than one type of tuning, like some of the newer "hybrid" tuners--a card that supports both NTSC and PAL is an example of such a card.&amp;nbsp; 
&lt;LI&gt;&lt;I&gt;DevInstance&lt;/I&gt;, &lt;I&gt;DevName&lt;/I&gt;, and &lt;I&gt;DevPath &lt;/I&gt;are obtained from the tuner driver, and give Media Center "pointers" to the physical device.&amp;nbsp; If you open up Device Manager and look at the advanced properties for the matching device, you will find that the values map 1:1 to entries here. 
&lt;LI&gt;&lt;I&gt;PrefEncoder&lt;/I&gt; either points to another hardware ID (in the case of a tuner with hardware MPEG2 encoding) or a software encoder (e.g. ATI AIW cards).&amp;nbsp; This is populated after we successfully build a capture graph for the device, and points to the MPEG2 encoder that is included in the graph at that time.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;It's important to note that ehrecvr will create a key for every tuner device detected, whether or not it is configured in Media Center or not.&amp;nbsp; Whether it is available for tuning in Media Center is just a matter of whether the registry keys &lt;I&gt;says&lt;/I&gt; it is.&amp;nbsp; For example, you can easily get more than 2 tuners working for scheduling, recording and Live TV viewing by editing the registry entries for the tuners to enable them.&amp;nbsp; The reason that you cannot do this through the UI is simply because there is not a good graphical way to resolve recording/viewing conflicts amongst more than 2 tuners for a given TuningSpace.&amp;nbsp; Instead of being able to choose which of the 4 tuners to "steal", you can only choose from 2 of them.&amp;nbsp; However, with 4 tuners you're much less likely to actually&lt;I&gt; &lt;/I&gt;need conflict resolution, so IMHO it's acceptable.&lt;/P&gt;
&lt;P&gt;To actually get the n-tuner scenario working properly, every tuner must be in the same TuningSpace, and change channels the same way.&amp;nbsp; So you cannot mix STB with non-STB, Satellite with Cable, etc. This is due to limitations in the Guide and PVR engine, not in the capture or playback engines.&amp;nbsp; STB tuners are somewhat of a pain, so I recommend using Method 2 (below) if you are going to go with n-tuners on STBs.&amp;nbsp; Also, you must have an STB for each and every tuner... not a fun scenario if you have to pay for each one.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;This week's Media Center tweak is getting N tuners working in Media Center.&amp;nbsp; There are various versions floating around out there on the internet, most of which include extra, unnecessary steps, likely because the authors figured out this stuff without the benefit of internal knowledge of the codebase, so they included everything they did to get it all working.&amp;nbsp; &lt;A href="http://www.thegreenbutton.com/community/shwmessage.aspx?ForumID=27&amp;amp;MessageID=106105"&gt;The version of this tweak posted on The Green Button&lt;/A&gt; works just like Method 2 below, but requires a reboot between each configuration run.&lt;/P&gt;
&lt;P&gt;If you have NTSC + ATSC, you can use this method for the ATSC tuners, the NTSC tuners, or both!&amp;nbsp; The only limitations are your hard drive's bandwidth, your system bus bandwidth, CPU time, and the number of tuners you can attach to the machine.&amp;nbsp; For NTSC that means a practical limit of about 10 tuners, if they are all recording non-DRM content.&amp;nbsp; For High Definition ATSC and DVB it's a little more intensive, but since there's no encoding going on (digital broadcasts are already encoded!), it actually balances out a little, with a top limit of around 7-8 tuners.&amp;nbsp; I have personally run 3 ATSC + 6 NTSC on my home system (through dual-tuner USB devices like the Adaptec AVC-3610), and it hummed right along (1 GB DDR Dual-Channel DDR 3200 RAM, Pentium 4 2.8 GHz (HT), 2x 7200 RPM 500GB Hitachi SATA drives in RAID-0 with the system/boot drive on a 40 GB PATA drive).&amp;nbsp; That's a bit more than I need, so I backed off to only 3 NTSC (2 USB + 1 PCI) and 2 ATSC (both PCI).&lt;/P&gt;
&lt;P&gt;Step-by-step, here's how to get n-tuner going.&amp;nbsp; Both methods assume you've already installed the tuners and have the drivers installed.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;B&gt;N Tuners in MCE, Method 1 (only registry editing):&lt;/B&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Stop the Media Center Receiver Service (&lt;TT&gt;net stop ehrecvr&lt;/TT&gt;) 
&lt;LI&gt;Open Registry Editor (&lt;TT&gt;regedit.exe&lt;/TT&gt;) and open this key:&lt;BR&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Media Center\Service\Video\Tuners\&lt;I&gt;{GUID}&lt;/I&gt;&lt;BR&gt;where &lt;I&gt;{GUID}&lt;/I&gt; is either {71985F48-1CA1-11D3-9CC8-00C04F7971E0} for Digital (ATSC or DVB-T) or {A799A800-A46D-11D0-A18C-00A02401DCD4} for Analog (NTSC or PAL). 
&lt;LI&gt;Under the &lt;I&gt;{GUID}&lt;/I&gt; key, there will be one key per tuner device. 
&lt;LI&gt;Select the first tuner's key. 
&lt;LI&gt;Select the UserSettings key. 
&lt;LI&gt;Set these DWORD values as follows (case sensitive, all values in hexadecimal), creating them if they do not exist:&lt;BR&gt;EnabledForMCE = 0xffffffff&lt;BR&gt;UseSTB = 0 
&lt;LI&gt;Create a REG_SZ value named UserDefName and set its value to "Tuner X", where X is the tuner number (1 for the first tuner, 2 for the 2nd, etc.) 
&lt;LI&gt;&lt;B&gt;If this is the FIRST tuner:&lt;/B&gt;&lt;BR&gt;RecordOrder = 0&lt;BR&gt;RecordPrefered = 0xffffffff&lt;BR&gt;WatchOrder = number of tuners - 1, e.g. for 4 tuners set this to 3&lt;BR&gt;WatchPrefered = 0&lt;BR&gt;&lt;BR&gt;&lt;B&gt;If this is the LAST tuner:&lt;/B&gt;&lt;BR&gt;RecordOrder = number of tuners - 1, e.g. for 4 tuners set this to 3&lt;BR&gt;RecordPrefered = 0&lt;BR&gt;WatchOrder = 0&lt;BR&gt;WatchPrefered = 0xffffffff&lt;BR&gt;&lt;BR&gt;&lt;B&gt;If this is a tuner somewhere in the middle:&lt;/B&gt;&lt;BR&gt;RecordOrder = whatever you put for the last tuner + 1&lt;BR&gt;RecordPrefered = 0&lt;BR&gt;WatchOrder = whatever you put for the last tuner - 1&lt;BR&gt;WatchPrefered = 0&lt;BR&gt;&lt;BR&gt;The idea here is that you increment the RecordOrder by 1 for each tuner, and decrement the WatchOrder by 1.&amp;nbsp; RecordOrder starts at 0 on the first tuner and goes up to #Tuners - 1; WatchOrder starts at #Tuners - 1 and ends at 0 on the last tuner.&amp;nbsp; RecordPrefered is true (0xffffffff) on the first tuner, false (0x00000000) everywhere else; WatchPrefered is true on the last tuner, false everywhere else. 
&lt;LI&gt;Repeat steps 7 - 10 for each tuner, adjusting the values of RecordOrder, RecordPrefered, WatchOrder and WatchPrefered as appropriate. 
&lt;LI&gt;Close Registry Editor. 
&lt;LI&gt;Start Media Center. Voila!&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Yes, "Prefered" is misspelled.&amp;nbsp; We caught that after we shipped, and it's a little late to change now...&lt;/P&gt;
&lt;P&gt;&lt;B&gt;N Tuners in MCE Method 2 (a little registry stuff, no manual editing though):&lt;/B&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Start the Media Center shell (Green Button) 
&lt;LI&gt;Go to Settings--&amp;gt;TV--&amp;gt;Set Up TV Signal 
&lt;LI&gt;Choose the 2 tuners from the list of tuners that you will configure this time (first time through, just the first 2) 
&lt;LI&gt;Close the Media Center shell. 
&lt;LI&gt;Stop the Media Center Receiver service (&lt;TT&gt;net stop ehrecvr&lt;/TT&gt; or stop the service from Control Panel--&amp;gt;Administrative Tools--&amp;gt;Services) 
&lt;LI&gt;Open Registry Editor (&lt;TT&gt;regedit.exe&lt;/TT&gt;) and open this key:&lt;BR&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Media Center\Service\Video\Tuners\&lt;I&gt;{GUID}&lt;/I&gt;&lt;BR&gt;where &lt;I&gt;{GUID}&lt;/I&gt; is either {71985F48-1CA1-11D3-9CC8-00C04F7971E0} for Digital (ATSC or DVB-T) or {A799A800-A46D-11D0-A18C-00A02401DCD4} for Analog (NTSC or PAL). 
&lt;LI&gt;Under the &lt;I&gt;{GUID}&lt;/I&gt; key, there will be one key per tuner device. 
&lt;LI&gt;Find the 2 keys that were just configured by Media Center.&amp;nbsp; You can tell which ones they are by looking for the "EnabledForMCE" value under the UserSettings key.&amp;nbsp; If it is set to 0xffffffff, it was configured--otherwise it will be 0x00000000 (0). 
&lt;LI&gt;Export the 2 keys to .reg files on your hard disk. (right-click on the {GUID} key and choose Export [selected branch only]).&amp;nbsp; Make a note of where you save those files... you're going to need them!&amp;nbsp; Name each one differently (e.g. Tuner1.reg, Tuner2.reg). 
&lt;LI&gt;Repeat steps 1 - 8 for each set of 2 tuners (if you have 3, then just then 3rd, etc.), selecting different tuners each time. 
&lt;LI&gt;Repeat steps 4 and 5. 
&lt;LI&gt;Double-click on each of the .reg files you created in step 9 to import them into the registry. 
&lt;LI&gt;Close Registry Editor. 
&lt;LI&gt;Start Media Center. Voila!&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Next week we'll talk about the PVR engine and recording management.&lt;/P&gt;
&lt;P&gt;This posting is provided AS-IS with no warranties.&amp;nbsp; The views expressed above do not represent those of Microsoft Corporation.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=567832" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Media+Center/default.aspx">Media Center</category></item><item><title>Media Center Technical Discussion Series</title><link>http://blogs.msdn.com/peterrosser/archive/2006/04/03/567506.aspx</link><pubDate>Mon, 03 Apr 2006 21:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:567506</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/567506.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=567506</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=567506</wfw:comment><description>&lt;P&gt;One of the more popular subjects for users who email me is how to get Media Center to do something that cannot be done (or is hard to do) from the UI.&amp;nbsp; Since I have not been able to talk about my current work much (Windows Vista and unannounced other stuff)&amp;nbsp;I am kicking off a roughly weekly technical discussion on tweaking Media Center.&lt;/P&gt;
&lt;P&gt;Planned discussions:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A HREF="/peterrosser/archive/2006/04/03/MCE_TechTalk_1.aspx"&gt;Tuners and Tuning Spaces &lt;/A&gt;
&lt;LI&gt;PVR and Recording 
&lt;LI&gt;Unattended/Scripted Configuration 
&lt;LI&gt;Video Playback 
&lt;LI&gt;Writing Your Own Media Center Application&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Want to know how to tweak something in Media Center that's not listed above?&amp;nbsp; Let me know and I'll see if I can work it in.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=567506" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Media+Center/default.aspx">Media Center</category></item><item><title>VoodooPC's 8TB Media Center PC</title><link>http://blogs.msdn.com/peterrosser/archive/2006/03/02/542493.aspx</link><pubDate>Fri, 03 Mar 2006 01:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:542493</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/542493.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=542493</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=542493</wfw:comment><description>&lt;P&gt;From Engadget:&lt;/P&gt;
&lt;DIV align=center&gt;&lt;A href="http://news.com.com/2100-1003_3-6044142.html?part=rss"&gt;&lt;IMG alt="" hspace=4 src="http://img.engadget.com/common/images/5178632431807386.jpg?0.19406108734385585" align=absBottom vspace=4 border=0&gt;&lt;/A&gt; &lt;/DIV&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;BR&gt;When we heard that VoodooPC was planning a media PC with 16 drive bays and a maximum capacity of 8 terabytes... [&lt;A href="http://www.engadget.com/2006/02/28/voodoopc-plans-8tb-media-pc/"&gt;Read full posting on Engadget&lt;/A&gt;]&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;Sounds pretty cool--maybe I'll get one here to "test" with ^_^.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=542493" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Media+Center/default.aspx">Media Center</category><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Found/default.aspx">Found</category></item><item><title>Tripod sings about romantic love</title><link>http://blogs.msdn.com/peterrosser/archive/2006/02/24/TripodRomance.aspx</link><pubDate>Sat, 25 Feb 2006 03:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:538945</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/538945.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=538945</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=538945</wfw:comment><description>&lt;P&gt;I saw this the other day... definitely worth a viewing.&lt;/P&gt;
&lt;P&gt;WARNING: If you have a girlfriend/wife/S.O. and you game a lot, you might want to put on headphones or suffer facial contortions and rolling eyes.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://video.google.com/videoplay?docid=1329362959167995041&amp;amp;q=tripod"&gt;http://video.google.com/videoplay?docid=1329362959167995041&amp;amp;q=tripod&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;HAHAHA&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=538945" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Found/default.aspx">Found</category></item><item><title>Using exported DLL functions</title><link>http://blogs.msdn.com/peterrosser/archive/2006/02/22/ExportedDllFunctions.aspx</link><pubDate>Thu, 23 Feb 2006 01:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:537396</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/537396.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=537396</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=537396</wfw:comment><description>&lt;P&gt;Now and then it's necessary to use "private" or "internal-only" functions in DLLs that you did not write, don't have the source for, and/or cannot get public interfaces for.&amp;nbsp; I recently had to do this again for a utility application, so I thought it would be nice to document the process a little more clearly for others.&lt;/P&gt;
&lt;P&gt;A starting assumption is that the reader is familiar with GetProcAddress() in its "main" form, which is when you know the full signature of the function you need to call.&amp;nbsp; For example, if you have a copy of foo.dll that exports Bar(LPWSTR, DWORD*):&lt;/P&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;// library function is: Bar(LPWSTR lpParam, DWORD *pdwParam)&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;typedef&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;__stdcall&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; *BAR_PROC)(LPWSTR, DWORD*);&lt;BR&gt;&lt;BR&gt;HANDLE hFoo = LoadLibrary(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"foo.dll"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;);&lt;BR&gt;BAR_PROC proc = (BAR_PROC)GetProcAddress(hFoo, &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"Bar"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;);&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;// call the library function&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;DWORD dwParam = 0x4;&lt;BR&gt;(proc)(L&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"string"&lt;/FONT&gt;&lt;FONT size=2&gt;, &amp;amp;dwParam);&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;But what if you need to access a function that is not included in the named exports of the library?&amp;nbsp; 90% of the time the functions will be exported with a name, but sometimes not, and for various reasons.&amp;nbsp; The most common reason is for "security through obscurity", because using the function is supposed to be something that you, the user, "should never have to do".&amp;nbsp; Unfortunately, there are scenarios when you need to do just that, for reasons the original publisher never considered, such as if you need to tweak the way something behaves in your mission-critical server process, and the company that made the original custom component has gone out of business.&lt;/P&gt;
&lt;P&gt;Enter the "ordinal" function access method.&amp;nbsp; If you look at the MSDN docs, they even allude to using a function's ordinal with GetProcAddress, but it's a bit of a mystery how to a) get the ordinal, and b) how to use it even if you get it.&amp;nbsp; Once you know the ordinal and prototype of a function, it's simple to use it--getting the function prototypes is the fun part.&lt;/P&gt;
&lt;P&gt;Say you got your hands on a .DEF file that lists the function ordinals, or have used link.exe and&amp;nbsp;through sufficiently wizardly use of a hex editor have examined the [NONAME] functions and determined what their prototypes are.&amp;nbsp; Let's pretend that the Bar function above was actually a [NONAME] function, and you got a listing like this from link.exe /dump /exports foo.dll:&lt;/P&gt;&lt;PRE&gt;Microsoft (R) COFF/PE Dumper Version 7.10.4035 
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file c:\myprojects\foo.dll 

File Type: DLL

  Section contains the following exports for foo.dll

    00000000 characteristics 
    41107692 time date stamp Tue Aug 03 22:39:30 2005 
        0.00 version 
           1 ordinal base 
           6 number of functions 
           4 number of names 

    ordinal hint RVA      name 
          3    0 00006948 Connect 
          4    1 00007798 Close 
          5    2 00012000 GetFoo 
          6    3 00014D12 SetFoo 
          1      0000F3A0 [NONAME] 
          2      0000D20A [NONAME]

  Summary

        6000 .data
        2000 .reloc
        9000 .rsrc
       18000 .text
&lt;/PRE&gt;
&lt;P&gt;The depends.exe tool provides similar data in a GUI fashion.&amp;nbsp;You can examine the binary at offsets F3A0 and D20A to determine what the function signature is (well, what the base pointer sig is), and match them up to the expected signature of Bar(LPWSTR, DWORD*) manually to get the proper ordinal.&amp;nbsp; Or more easily, if you know that one of the methods is the droid you are looking for, you can just code up a quick test app and poke at the method as if it were the one you wanted.&amp;nbsp; If it works without throwing an exception... ;-)&lt;/P&gt;
&lt;P&gt;Getting back to the main point, to load the exported-by-ordinal function, there's a handy macro pre-defined in the Visual Studio (v6 or later, IIRC) build environment&amp;nbsp;that can package up that ordinal into the "expected" LPSTR for GetProcAddress.&amp;nbsp; In my example, assuming Bar was actually at ordinal 1, you would do this:&lt;/P&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;// library function is: Bar(LPWSTR lpParam, DWORD *pdwParam)&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;typedef&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;__stdcall&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; *BAR_PROC)(LPWSTR, DWORD*);&lt;BR&gt;&lt;BR&gt;HANDLE hFoo = LoadLibrary(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"foo.dll"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;);&lt;BR&gt;BAR_PROC proc = (BAR_PROC)GetProcAddress(hFoo, MAKEINTRESOURCEA(1));&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;// call the library function&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;DWORD dwParam = 0x4;&lt;BR&gt;(proc)(L&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"string"&lt;/FONT&gt;&lt;FONT size=2&gt;, &amp;amp;dwParam);&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;The only difference is that you use the MAKEINTRESOURCEA macro to convert that ordinal into something that GetProcAddress can understand, rather than the string name of the function.&lt;/P&gt;
&lt;P&gt;If you really want to get tricky, you don't actually need GetProcAddress at all to do this magic.&amp;nbsp; If you can guarantee that the DLL won't change underneath you, or you don't mind breaking if it does, or you have smart scanning code that can "find" the offsets again, you can plug the RVA directly into the FARPROC variable.&amp;nbsp; It's all just numbers under the hood, after all.&amp;nbsp; Using the example output of link.exe from above, you can do this:&lt;/P&gt;&lt;FONT color=#008000 size=2&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;// library function is: Bar(LPWSTR lpParam, DWORD *pdwParam)&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;typedef&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;__stdcall&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt; *BAR_PROC)(LPWSTR, DWORD*);&lt;BR&gt;&lt;FONT color=#0000ff&gt;#define&lt;/FONT&gt;&lt;FONT color=#000000&gt; PROC_OFFSET 0x0000F3A0&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;HANDLE hFoo = LoadLibrary(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"foo.dll"&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;);&lt;BR&gt;BAR_PROC proc = (BAR_PROC)(hFoo + PROC_OFFSET)&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;;&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;// call the library function&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;DWORD dwParam = 0x4;&lt;BR&gt;(proc)(L&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"string"&lt;/FONT&gt;&lt;FONT size=2&gt;, &amp;amp;dwParam);&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;Why does this work?&amp;nbsp; LoadLibrary(dll) loads the specified library into the process' address space, and returns a HANDLE value.&amp;nbsp; This HANDLE is the starting address of the library, and since the RVA values for a DLL are offsets from the starting address, you can perform simple addition to the base to get a function's entry point.&amp;nbsp; Pretty cool, huh?&amp;nbsp; All GetProcAddress does is read the DLL's export table into a struct and performs the math for you, returning the result.&amp;nbsp; I'm a big fan of not reinventing the wheel, so I use GetProcAddress when there's an exports entry for what I need.&lt;/P&gt;
&lt;P&gt;What do you do if the function you need is not exported at all?&amp;nbsp; Nine times out of ten it's much easier to just get it exported, but if that's not possible, well, that's a topic for another day.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=537396" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Coding/default.aspx">Coding</category><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Windows/default.aspx">Windows</category></item><item><title>Captioning Support Sucks</title><link>http://blogs.msdn.com/peterrosser/archive/2006/02/19/Captioning-Support-Sucks.aspx</link><pubDate>Sun, 19 Feb 2006 12:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:534977</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/534977.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=534977</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=534977</wfw:comment><description>Looking back at the bugs we've fixed over the last several months, we certainly have had a good share of captioning issues, especially with regards to the size of the codebase compared to  the "video" code.  Surprisingly, we don't hear from users a ton when captions don't work properly, but maybe that's because a minority of the users actually use them in the first place.

I'm not usually so negative, but I'm just annoyed at captioning today.  The following is a poorly thought-out rant on the subject.

......(&lt;a href="http://blogs.msdn.com/peterrosser/archive/2006/02/19/Captioning-Support-Sucks.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=534977" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Musing/default.aspx">Musing</category></item><item><title>DVB Guide issues - "cannot schedule recoding because guide data cannot be accessed"</title><link>http://blogs.msdn.com/peterrosser/archive/2006/02/15/DvbGuideProblem.aspx</link><pubDate>Thu, 16 Feb 2006 10:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:533073</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/533073.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=533073</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=533073</wfw:comment><description>&lt;P&gt;We have been getting reports about Guide problems&amp;nbsp;from DVB users across&amp;nbsp;Europe and the world, hopefully in time for the next Rollup release (external date not yet announced, but should be late Q1 to early Q2).&amp;nbsp; The problem typically manifests itself when scheduling many shows to record, but can occur anytime.&amp;nbsp; Without a code fix, you cannot work around the issue cleanly/easily, but closing the shell (Media Center UI) and restarting the "Media Center Scheduler Service" (ehsched) will reset the state of the machine.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Edit: This is the "cannot schedule recording because guide data can't be accessed" issue.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;We root-caused the problem to an unusual memory management problem in how we deal with the Guide data.&amp;nbsp; For performance reasons, we temporarily increase certain buffer sizes during a Guide download, and decrease them again later.&amp;nbsp; There is a timing issue with garbage collection events in some situations, though, that can cause the decrease to not take effect "in time", thus keeping the buffer sizes large.&amp;nbsp; This does not actually reduce the amount of real memory used, but it does exhaust the virtual address space eventually.&amp;nbsp; You can observe the behavior using &lt;A href="http://www.sysinternals.com/Utilities/ProcessExplorer.html"&gt;SysInternals' Process Explorer&lt;/A&gt; by adding the "Virtual Size" column (under the Process Performance tab) and observing its value for ehrec.exe.&lt;/P&gt;
&lt;P&gt;With better knowledge of the cause, though, comes a better workaround than "gun ehshell.exe and restart ehsched when it happens".&amp;nbsp; Until the fix comes out, the best thing to do to &lt;EM&gt;prevent&lt;/EM&gt; this problem from occurring is probably to set up a Scheduled Task to do those things for you at a predictable time.&amp;nbsp;To wit:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Download recycle_mce.cmd from&amp;nbsp;&lt;A href="http://pegasi.com/recycle_mce.zip"&gt;here&lt;/A&gt;.&amp;nbsp;(script to recycle ehshell.exe and TV services).&amp;nbsp; Unpack the script somewhere on your drive. 
&lt;LI&gt;Change your Guide download time to a time that you are not likely to have a need to either watch TV on your MCE or record a show.&amp;nbsp; 4am is pretty safe for me, but to each his own.&amp;nbsp; I wrote a tool that lets you edit this time easily, you can &lt;A href="http://www.pegasi.com/MceDlTimeEditor_0.1.zip"&gt;download it from my site&lt;/A&gt;. 
&lt;LI&gt;Create a Scheduled Task to run the script daily about 30 minutes after the time you configured the Guide to download.&amp;nbsp; If you have a modem, you may need to give it more time.&amp;nbsp; If you have a pretty fast computer and broadband, 30 minutes is very generous. &lt;A href="http://www.uwec.edu/help/WinXP/scheduledtasks.htm"&gt;Guide to creating scheduled tasks&lt;/A&gt;.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;It's not a perfect solution, since a) it presumes you have a time during the day you will not make recordings or watch TV, and b) it cannot prevent the problem 100%, especially if you are a "heavy" user.&amp;nbsp; If you run into the problem, though, running recycle_mce.cmd will at least reset your state.&lt;/P&gt;
&lt;P&gt;The real fix is coming with the next rollup, but since there are users out there feeling pain &lt;EM&gt;now&lt;/EM&gt;, I thought I'd try to help a little.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The programs, scripts, and instructions in this posting are provided AS-IS, with no warranties, and are not sanctioned nor released by Microsoft.&lt;/STRONG&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=533073" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Media+Center/default.aspx">Media Center</category><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Tools/default.aspx">Tools</category></item><item><title>A Brief History of ATSC in Media Center</title><link>http://blogs.msdn.com/peterrosser/archive/2006/02/03/AtscInMce.aspx</link><pubDate>Fri, 03 Feb 2006 11:09:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:523878</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>26</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/523878.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=523878</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=523878</wfw:comment><description>&lt;p&gt;In the beginning there was NTSC in Freestyle (Media Center 2002), and it was good.&amp;nbsp; Media Center supported the #1 market and proved that computers could do a great job recording television, pausing Live TV, and organizing recordings.&amp;nbsp; With support for one tuner under our belt and an enthusiastic user base, we moved forward with Harmony (Media Center 2004) to a more mature, flexible and polished product that supported&amp;nbsp;dual NTSC or PAL tuners, opening up the European, Asian and Australian marketplaces.&amp;nbsp; A few intrepid souls figured out how to hack together ATSC support into Harmony using little-known interfaces and scarce hardware like the VBox 110.&lt;/p&gt;
&lt;p&gt;Between the release of Harmony and Symphony (Media Center 2005), ATSC demand increased by leaps and bounds, though still smaller than the NTSC base by far.&amp;nbsp; To this day, only a very small percentage of Media Center users actually use ATSC, although it's a matter of some discussion whether that number is small because the number of HDTVs is small, or because Media Center's support is... less than optimal.&amp;nbsp; In any case, by the release of Symphony the user community was clamoring for ATSC support without hacks, and was disappointed when Symphony shipped without it.&amp;nbsp; An update quickly followed, though, and Symphony Rollup 1 with HDTV Support was released as a free update through Windows Update and the Microsoft Download Center. The changes in Emerald (Rollup 2) and Diamond (Windows Vista) did/will not not substantively change the architecture of ATSC, so what we have today will more or less be the way it works for another couple of years. &lt;/p&gt;
&lt;p&gt;&lt;font size=4&gt;&lt;em&gt;••• design decisions&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;When we (speaking in generalities here, since I was not a member of the team at the time) first investigated how to include ATSC into the product, there were several major hurdles standing in the way.&amp;nbsp; The first was a consequence of our decision to use the VMR (Video Mixing Renderer) instead of the deprecated Overlay Mixer for rendering video.&amp;nbsp; Overlay rendering differs from mixing in the way that video is prepared for display.&amp;nbsp; In overlay mode, the video is literally painted over the top of whatever else is being rendered.&amp;nbsp; In mixing mode, "surfaces" with video or other graphics are blended together, either in software or hardware-accelerated, prior to rendering on the monitor.&amp;nbsp; The advantage of mixing mode is greatly increased flexibility in what you can display at the cost of performance.&amp;nbsp; It takes a lot more horsepower to process all those pixels, especially with alpha (transparency) and 3D effects.&amp;nbsp; 99% of the video hardware on the market today uses a form of overlay mode, which drastically reduces the hardware requirements (e.g. no 3D hardware required), but hamstrings them when viewed side-by-side with the sort of effects you can get with mixing.&amp;nbsp; The semi-transparent menus on top of video that you see in Media Center that give it such a cool look are just not possible with overlay mode.&amp;nbsp; All that alpha blending and those 3D effects come at a hefty cost, though.&amp;nbsp; Media Center has to work many times harder to get the video to the screen, even when &lt;i&gt;no&lt;/i&gt; special effects are on-screen at the time.&amp;nbsp; That, in a nutshell, is why Media Center requires not just an OK video card to shine.&amp;nbsp; And a faster CPU.&amp;nbsp; As a result of the increased power needed to render video, and with the hardware available to consumers in 2000-2002, it wasn't really feasible to offer HD with the first couple of releases.&lt;/p&gt;
&lt;p&gt;Even if the video could keep up (which it could on higher-end systems, even in 2002), there was another difficulty: Guide data.&amp;nbsp; The problem is that when you get multiple lineups (the term we use for the programming information associated with the set of channels available on a given medium in a geographical area), merging them into a single lineup and making it easy for the user is not an easy solution.&amp;nbsp; The decision was made to punt it until demand was increased, and to stick with a simpler homogenous lineup, rather than the more advanced heterogeneous lineup that would be required to support both NTSC and ATSC on a single system.&amp;nbsp; The market of people that have more than one TV provider is, after all, not that large, and we wanted to get it right for the most people we could.&lt;/p&gt;
&lt;p&gt;&lt;font size=4&gt;&lt;em&gt;••• support for ATSC gathers steam&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;A vocal minority of the user community, along with a large majority of the eHome TV product team, were not pleased with the lack of support.&amp;nbsp; We got the funding to put ATSC in the product, as long as we could fit it into the schedule and without major risks to the architecture of Media Center's TV and PVR functionality.&amp;nbsp; With compressed schedules the norm, and the development and testing staff already deeply into a bad work/life balance, many options were considered for getting ATSC out to users.&amp;nbsp; What was finally implemented is a good first stab at doing it, with a few facets that are, um, less than what we'd like them to be.&amp;nbsp; Since we did not have ATSC-specific listings available through our Guide data provider for many, many areas, we looked instead at reusing the data available from existing analog lineups via "mapping".&amp;nbsp; Since ATSC channels are in a completely different format (like 13-1 or 9-5), and to avoid putting a new button on the remote (requiring a redesign), ATSC channels are renumbered in the UI.&amp;nbsp; The scheduling/PVR conflicts were just ignored, leaving it up to the user to say "only record this channel", omitting support like "record this in HD if you can, but get it in SD if not".&amp;nbsp; The end result was a pseudo-heterogeneous lineup support that we have today.&amp;nbsp; You do get the additional ATSC lineup merged into your Guide, but the analog source is still required--you cannot have ATSC without NTSC today.&lt;/p&gt;
&lt;p&gt;&lt;font size=4&gt;&lt;em&gt;••• the current state of things&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;During First Run (the initial Media Center setup wizard), or TV Signal Setup, we detect whether you are in a region that supports ATSC, and then detect if you have a compatible ATSC card installed (or for Emerald, up to 2 ATSC cards).&amp;nbsp; After configuring your SD tuner, ATSC is configured as an adjunct to the "primary" analog tuners.&amp;nbsp; If you choose an analog, sans-STB (set-top box) cable lineup for your analog tuners, then that data is what's available to ATSC to map to its channels.&amp;nbsp; The same goes for satellite or OTA (off-the-air/broadcast) lineups.&amp;nbsp; Only with digital cable lineups do you usually get the full Guide data to assign to your ATSC channels.&lt;/p&gt;
&lt;p&gt;To assign listings to the ATSC channels in the lineup, we run a heuristic match against the available channel metadata, and try to get a "best-fit" match for existing channels to the new ATSC channels.&amp;nbsp; For example, if there is a channel "KOMO-DT" in the primary lineup, it can be matched to the known ATSC channel KOMO-DT on 4-1.&amp;nbsp; In some areas, the match can't be made automatically, but you can go to the Guide settings (Settings--&amp;gt;TV--&amp;gt;Guide--&amp;gt;Edit Digital TV Listings) and manually associate the listings of an existing channel to the ATSC channel.&amp;nbsp; Basically what you are doing is saying "this channel that exists on my "primary" lineup has identical programming to that ATSC channel".&amp;nbsp; It works best with digital cable lineups because they carry all of the local OTA ATSC channels on their networks (due to Federal must-carry laws).&amp;nbsp; To get the minor channels (where the "minor channel" &amp;gt; 1, e.g. KCTS-DT2 on 9-2 in Seattle), you have to add them to your lineup manually using Add Missing Channels, and then map them to listings using Edit Digital TV Listings.&lt;/p&gt;
&lt;p&gt;The end result of all of this is a unified lineup that can be presented to the user in a single Guide grid.&amp;nbsp; ATSC channels are assigned numbers like 1041 for channel 4-1, and slotted in where they fit best.&amp;nbsp; If your primary lineup already has a channel 1041, we look for another block of numbers to put the ATSC channels.&amp;nbsp; A side-effect of this is that if your primary lineup is changed--like if Comcast decides to add a channel 1000 to their lineup--the ATSC channel numbers may get reassigned to another empty block.&amp;nbsp; Personally, I'd like to implement a better solution, but as I've said before, we Americans are unnaturally attached to our channel numbers.&amp;nbsp; Most would just give you a blank look if you suggested that we don't even really &lt;i&gt;need&lt;/i&gt; channel numbers at all.&amp;nbsp; Not when you have a good enough search/filter mechanism, anyhow.&lt;/p&gt;
&lt;p&gt;&lt;font size=4&gt;&lt;em&gt;••• the days to come&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;For the Diamond release, we have announced support for OCUR (OpenCable Unidirectional Receiver) tuners, which will allow native tuning of digital cable signals, with CableCard support (for premium channels like HBO).&amp;nbsp; This includes HDTV signals, which should be good news to most users.&amp;nbsp; More people pay for TV service now than don't, and if you own a Media Center, you are about 20 times more likely to have cable or satellite service than not.&amp;nbsp; Roughly.&amp;nbsp; OCUR support probably means (definitely, for Diamond) that we won't be supporting heterogeneous lineups anytime soon, which is a shame, but hard to make a business case against.&amp;nbsp; Why spend time and treasure on something that most people won't use, and could possibly destabilize the entire product?&amp;nbsp; That's a little hyperbolic, but the onus is on the people who want the feature to justify it.&lt;/p&gt;
&lt;p&gt;We announced a deal with DirecTV where we will directly support their newest STB in Media Center, just like--or very similar to--the OCUR does with digital cable.&amp;nbsp;&amp;nbsp;The field is finally opening up and we're getting to a point where we can offer our users very attractive options for "traditional" TV services.&amp;nbsp; The European market, or more precisely, the non-U.S./S.Korea/Japan market, has already standardized (for the most part) on a fairly sensible broadcasting standard--DVB--which we are improving our support for with every release.&lt;/p&gt;
&lt;p&gt;Non-traditional video services are also booming in popularity, with Online Spotlight partners offering more movies and other multimedia content for free (in many cases) or on an ala-carte basis, directly competing with PPV services offered by traditional TV providers.&amp;nbsp; Apple has changed course on its "we'll never get into the PVR business" policy with iTunes video (and their toe-dip product Front Row, which is a pretty spiffy little QuickTime automation script), and The Market is scrambling all over itself to get on the bandwagon.&amp;nbsp; Internet TV is coming, just as soon as we (as in "we the market", not necessarily "we at Microsoft") figure out what Internet TV is.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=523878" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Media+Center/default.aspx">Media Center</category><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Musing/default.aspx">Musing</category></item><item><title>DISH Network &amp; ATSC channels</title><link>http://blogs.msdn.com/peterrosser/archive/2006/02/01/521735.aspx</link><pubDate>Wed, 01 Feb 2006 12:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:521735</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/521735.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=521735</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=521735</wfw:comment><description>&lt;p&gt;I have been working on a fix for the ATSC channel number assignment issue currently impacting Rollup 2 users.&amp;nbsp; The scenario is that if you have any channels in the 9000s (like DISH Network)&amp;nbsp;&lt;em&gt;and &lt;/em&gt;you have ATSC channels, they will get assigned numbers in the 10000s.&amp;nbsp; That's a problem if you want to change directly to the channel by typing in its channel number, due to UI restrictions.&lt;/p&gt;
&lt;p&gt;Rather than fix the UI, we chose the safer/less impact path of changing how we figure out the channel numbers for the ATSC lineup.&amp;nbsp; The exact algorithm probably won't be made public, so I can't get too specific, but basically it will work like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If the highest non-ATSC channel is less than 9000, use the next block of 1000 numbers after that channel for ATSC.&amp;nbsp;&amp;nbsp;ATSC channels will get numbers in the format:&amp;nbsp;offset +&amp;nbsp; major*10 + minor (unless there is a minor&amp;gt;9, in which case they get assigned sequential numbers).&amp;nbsp; So if the highest non-ATSC is 5001, ATSC channel 13.2 will be 6132.&lt;/li&gt;
&lt;li&gt;If there is a non-ATSC channel in the 9000s, search for a free block of numbers within the entire range of channels, preferring larger blocks, and blocks that fall on even multiples of their size (i.e. blockStart % blockSize = 0).&amp;nbsp; Try fairly hard to keep the major + minor data present as much as possible in the ultimate channel number.&lt;/li&gt;
&lt;li&gt;If no blocks of sufficient size are found, assign channel numbers to the ATSC lineup in a first-available way, slotting them into empty numbers as necessary.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The three methods above are tried in order, so if 1 succeeds, 2 and 3 are not used, etc..&amp;nbsp; Number 3 is very unlikely, absent some boneheaded move by a cable or satellite provider to evenly space their channels throughout the first 10000 numbers.&amp;nbsp; The most likely is number 1, except for DISH Network users, who get channels in the 9000s right now.&lt;/p&gt;
&lt;p&gt;My fondest wish is that we could just ditch channel numbers entirely and be done with it... but we Americans are too attached to them.&amp;nbsp; For now.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=521735" width="1" height="1"&gt;</description></item><item><title>Fix coming for ATSC minor channels guide bug</title><link>http://blogs.msdn.com/peterrosser/archive/2006/01/30/519576.aspx</link><pubDate>Mon, 30 Jan 2006 21:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:519576</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>13</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/519576.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=519576</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=519576</wfw:comment><description>&lt;p&gt;If you use ATSC with Media Center, and have mapped minor channels to listings, you probably noticed that the listings from the .1 channel are duplicated across the other minor channels (if the callsigns are similar enough).&amp;nbsp; This results in a display like this in the guide:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pegasi.com/atscMinors.jpg"&gt;&lt;img height=263 src="http://pegasi.com/atscMinors.jpg" width=350 border=0&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is more than a little inconvenient, since it also means that Media Center cannot schedule recordings accurately on the affected channels.&lt;/p&gt;
&lt;p&gt;Coming in the next rollup QFE for Media Center (late Q1/early Q2), we have a fix for the problem.&amp;nbsp; Unfortunately, the fix required a code change and &lt;em&gt;cannot&lt;/em&gt; be worked around with a registry tweak.&lt;/p&gt;
&lt;p&gt;The way it &lt;em&gt;should&lt;/em&gt; look is like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pegasi.com/atscMinorsFixed.jpg"&gt;&lt;img height=263 src="http://pegasi.com/atscMinorsFixed_small.jpg" width=350 border=0&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=519576" width="1" height="1"&gt;</description></item><item><title>Fix for ATSC after uninstalling Rollup 2</title><link>http://blogs.msdn.com/peterrosser/archive/2006/01/24/AtscFixForSymphony.aspx</link><pubDate>Tue, 24 Jan 2006 22:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:517006</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/517006.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=517006</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=517006</wfw:comment><description>&lt;P&gt;In some cases you may find that ATSC (HDTV) no longer works after uninstalling Media Center Rollup 2 from your computer.&amp;nbsp; The issue is caused by a schema change in the Tuners registry key.&amp;nbsp; Today I identified a workaround to get your ATSC back up and running without reinstalling Symphony or Rollup 2.&lt;/P&gt;
&lt;P&gt;To restore your ATSC functionality in Symphony:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Stop all Media Center services and processes&lt;/LI&gt;
&lt;OL&gt;
&lt;LI&gt;Close Media Center&lt;/LI&gt;
&lt;LI&gt;Start--&amp;gt;Run--&amp;gt;services.msc (or Control Panel--&amp;gt;Administrative Tools--&amp;gt;Services)&lt;/LI&gt;
&lt;LI&gt;Stop "Media Center Receiver Service"&lt;/LI&gt;
&lt;LI&gt;Stop "Media Center Scheduler Service"&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;Open Registry Editor (Start--&amp;gt;Run--&amp;gt;regedit.exe)&lt;/LI&gt;
&lt;LI&gt;Delete the key at:&lt;BR&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Media Center\Service\Video\Tuners&lt;/LI&gt;
&lt;LI&gt;Start Media Center&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;This has not been rigorously tested, and has not been "officially" released to the Microsoft Knowledge Base yet.&amp;nbsp; I am fairly confident of the fix, but this is posted AS-IS, with no warranties.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=517006" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Media+Center/default.aspx">Media Center</category></item><item><title>DVB Radio "No TV Signal" Workaround</title><link>http://blogs.msdn.com/peterrosser/archive/2006/01/22/DvbRadioWorkaroundForNoSignalError.aspx</link><pubDate>Mon, 23 Jan 2006 07:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:516080</guid><dc:creator>Peter Rosser</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/peterrosser/comments/516080.aspx</comments><wfw:commentRss>http://blogs.msdn.com/peterrosser/commentrss.aspx?PostID=516080</wfw:commentRss><wfw:comment>http://blogs.msdn.com/peterrosser/rsscomments.aspx?PostID=516080</wfw:comment><description>&lt;P&gt;I&amp;nbsp;am currently investigating a fix for two DVB Radio issues identified a workaround for those affected.&amp;nbsp; If you are getting a "No TV Signal" blue overlay when tuning to a DVB Radio station, particularly&amp;nbsp;a low-bitrate station like BBC World Service, or you are seeing 15+ second channel change times for changing between DVB Radio and DVB Video channels, this workaround may apply to you.&lt;/P&gt;
&lt;P&gt;This involves editing your registry, so if you are not comfortable doing that, please wait for the binary fix to be released.&lt;/P&gt;
&lt;P&gt;The key is:&lt;/P&gt;
&lt;P&gt;HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Media Center\Service\Video\Tuners\DVR&lt;/P&gt;
&lt;P&gt;Set &lt;STRONG&gt;NearUnderflowCheckMillis=4000 (0x00000fa0)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;If you are not experiencing problems with DVB Radio, do not change this value.&amp;nbsp; If you are in the U.S., for example, it can cause instability with ATSC tuning.&amp;nbsp; Once the binary fix is released, you should return this value to its original value of 2000 (decimal).&lt;/P&gt;
&lt;P&gt;This is a non-supported, non-official&amp;nbsp;workaround and is provided AS-IS, with no warranty.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=516080" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Coding/default.aspx">Coding</category><category domain="http://blogs.msdn.com/peterrosser/archive/tags/Media+Center/default.aspx">Media Center</category></item></channel></rss>