OSDComponent *SkinV2::VolumeOSD() { OSDComponent *volume = new OSDComponent; /* Images */ volume->background = LoadImg(_skinDir + L"\\OSD\\back.png"); volume->mask = LoadImg(_skinDir + L"\\OSD\\glassMask.png"); /* Sound */ std::wstring soundName = _skinDir + L"\\sound.wav"; SoundPlayer *player = new SoundPlayer(soundName); if (player->Ready() == false) { delete player; player = NULL; } volume->sound = player; /* Determine the number of units */ int units = 10; tinyxml2::XMLElement *meterMax = SubElement("osd", "meterMax"); if (meterMax) { meterMax->QueryIntText(&units); } volume->defaultUnits = units; /* Load the meter(s) */ const char *type = nullptr; tinyxml2::XMLElement *meterOrientation = SubElement("osd", "meterOrientation"); if (meterOrientation) { type = meterOrientation->GetText(); } int x = 0; int y = 0; tinyxml2::XMLElement *pos = SubElement("osd", "meterPosition"); if (pos) { tinyxml2::XMLElement *xelem = pos->FirstChildElement("X"); tinyxml2::XMLElement *yelem = pos->FirstChildElement("Y"); if (xelem) { xelem->QueryIntText(&x); } if (yelem) { yelem->QueryIntText(&y); } } std::wstring meterImg = _skinDir + L"\\OSD\\meter.png"; std::string meterType(type); if (meterType == "vertical") { volume->meters.push_back( new VerticalBar(meterImg, x, y, units)); } else if (meterType == "bitstrip") { /* For some reason, the number of units in v2 for bit strips was * (meterMax + 1), so we update the number of units here. */ volume->meters.push_back( new Bitstrip(meterImg, x, y, units + 1)); } else { /* Horizontal meter is the default */ volume->meters.push_back( new HorizontalBar(meterImg, x, y, units)); } tinyxml2::XMLElement *drawText = SubElement("osd", "drawPercentage"); if (drawText) { bool textEnabled = false; drawText->QueryBoolText(&textEnabled); if (textEnabled) { Text *t = CreateText(volume->background); if (t) { volume->meters.push_back(t); } } } return volume; }