/** * Try undo the harm done by the init function. * * This may leave the system in an unstable state since we might have been * hijacking memory below 1MB that is in use by the kernel. */ void vmmR0TripleFaultHackTerm(void) { /* * Restore overwritten memory. */ if ( g_pvSavedLowCore && g_pbLowCore) memcpy(g_pbLowCore, g_pvSavedLowCore, PAGE_SIZE); if (g_pbPage0) { g_pbPage0[0x467+0] = RT_BYTE1(g_u32SavedVector); g_pbPage0[0x467+1] = RT_BYTE2(g_u32SavedVector); g_pbPage0[0x467+2] = RT_BYTE3(g_u32SavedVector); g_pbPage0[0x467+3] = RT_BYTE4(g_u32SavedVector); g_pbPage0[0x472+0] = RT_BYTE1(g_u16SavedCadIndicator); g_pbPage0[0x472+1] = RT_BYTE2(g_u16SavedCadIndicator); } /* * Fix the CMOS. */ if (g_pvSavedLowCore) { uint32_t fSaved = ASMIntDisableFlags(); ASMOutU8(0x70, 0x0f); ASMOutU8(0x71, 0x0a); ASMOutU8(0x70, 0x00); ASMInU8(0x71); ASMReloadCR3(); ASMWriteBackAndInvalidateCaches(); ASMSetFlags(fSaved); } /* * Release resources. */ RTMemFree(g_pvSavedLowCore); g_pvSavedLowCore = NULL; RTR0MemObjFree(g_hMemLowCore, true /*fFreeMappings*/); g_hMemLowCore = NIL_RTR0MEMOBJ; g_hMapLowCore = NIL_RTR0MEMOBJ; g_pbLowCore = NULL; g_HCPhysLowCore = NIL_RTHCPHYS; RTR0MemObjFree(g_hMemPage0, true /*fFreeMappings*/); g_hMemPage0 = NIL_RTR0MEMOBJ; g_hMapPage0 = NIL_RTR0MEMOBJ; g_pbPage0 = NULL; }
DECLHIDDEN(int) drvHostBaseReadOs(PDRVHOSTBASE pThis, uint64_t off, void *pvBuf, size_t cbRead) { int rc = VINF_SUCCESS; if (pThis->Os.cbBlock) { /* * Issue a READ(12) request. */ do { const uint32_t LBA = off / pThis->Os.cbBlock; AssertReturn(!(off % pThis->Os.cbBlock), VERR_INVALID_PARAMETER); uint32_t cbRead32 = cbRead > SCSI_MAX_BUFFER_SIZE ? SCSI_MAX_BUFFER_SIZE : (uint32_t)cbRead; const uint32_t cBlocks = cbRead32 / pThis->Os.cbBlock; AssertReturn(!(cbRead % pThis->Os.cbBlock), VERR_INVALID_PARAMETER); uint8_t abCmd[16] = { SCSI_READ_12, 0, RT_BYTE4(LBA), RT_BYTE3(LBA), RT_BYTE2(LBA), RT_BYTE1(LBA), RT_BYTE4(cBlocks), RT_BYTE3(cBlocks), RT_BYTE2(cBlocks), RT_BYTE1(cBlocks), 0, 0, 0, 0, 0 }; rc = drvHostBaseScsiCmdOs(pThis, abCmd, 12, PDMMEDIATXDIR_FROM_DEVICE, pvBuf, &cbRead32, NULL, 0, 0); off += cbRead32; cbRead -= cbRead32; pvBuf = (uint8_t *)pvBuf + cbRead32; } while ((cbRead > 0) && RT_SUCCESS(rc)); } else rc = VERR_MEDIA_NOT_PRESENT; return rc; }
RTDECL(uint32_t) ASMByteSwapU32(uint32_t u32) { return RT_MAKE_U32_FROM_U8(RT_BYTE4(u32), RT_BYTE3(u32), RT_BYTE2(u32), RT_BYTE1(u32)); }
void UIVMPreviewWindow::sltRecreatePreview() { /* Only do this if we are visible: */ if (!isVisible()) return; /* Remove preview if any: */ if (m_pPreviewImg) { delete m_pPreviewImg; m_pPreviewImg = 0; } /* We are not creating preview for inaccessible VMs: */ if (m_machineState == KMachineState_Null) return; if (!m_machine.isNull() && m_vRect.width() > 0 && m_vRect.height() > 0) { QImage image(size(), QImage::Format_ARGB32); image.fill(Qt::transparent); QPainter painter(&image); bool fDone = false; /* Preview enabled? */ if (m_pUpdateTimer->interval() > 0) { /* Use the image which may be included in the save state. */ if ( m_machineState == KMachineState_Saved || m_machineState == KMachineState_Restoring) { ULONG width = 0, height = 0; QVector<BYTE> screenData = m_machine.ReadSavedScreenshotPNGToArray(0, width, height); if (screenData.size() != 0) { QImage shot = QImage::fromData(screenData.data(), screenData.size(), "PNG").scaled(m_vRect.size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); dimImage(shot); painter.drawImage(m_vRect.x(), m_vRect.y(), shot); fDone = true; } } /* Use the current VM output. */ else if ( m_machineState == KMachineState_Running // || m_machineState == KMachineState_Saving /* Not sure if this is valid */ || m_machineState == KMachineState_Paused) { if (m_session.GetState() == KSessionState_Locked) { CVirtualBox vbox = vboxGlobal().virtualBox(); if (vbox.isOk()) { const CConsole& console = m_session.GetConsole(); if (!console.isNull()) { CDisplay display = console.GetDisplay(); /* Todo: correct aspect radio */ // ULONG w, h, bpp; // display.GetScreenResolution(0, w, h, bpp); // QImage shot = QImage(w, h, QImage::Format_RGB32); // shot.fill(Qt::black); // display.TakeScreenShot(0, shot.bits(), shot.width(), shot.height()); QVector<BYTE> screenData = display.TakeScreenShotToArray(0, m_vRect.width(), m_vRect.height()); if ( display.isOk() && screenData.size() != 0) { /* Unfortunately we have to reorder the pixel * data, cause the VBox API returns RGBA data, * which is not a format QImage understand. * Todo: check for 32bit alignment, for both * the data and the scanlines. Maybe we need to * copy the data in any case. */ uint32_t *d = (uint32_t*)screenData.data(); for (int i = 0; i < screenData.size() / 4; ++i) { uint32_t e = d[i]; d[i] = RT_MAKE_U32_FROM_U8(RT_BYTE3(e), RT_BYTE2(e), RT_BYTE1(e), RT_BYTE4(e)); } QImage shot = QImage((uchar*)d, m_vRect.width(), m_vRect.height(), QImage::Format_RGB32); if (m_machineState == KMachineState_Paused) dimImage(shot); painter.drawImage(m_vRect.x(), m_vRect.y(), shot); fDone = true; } } } } } } if (fDone) m_pPreviewImg = new QImage(image); } update(); }
aubio_source_apple_audio_t * new_aubio_source_apple_audio(char_t * path, uint_t samplerate, uint_t block_size) { aubio_source_apple_audio_t * s = AUBIO_NEW(aubio_source_apple_audio_t); s->path = path; s->block_size = block_size; OSStatus err = noErr; UInt32 propSize; // open the resource url CFURLRef fileURL = getURLFromPath(path); err = ExtAudioFileOpenURL(fileURL, &s->audioFile); if (err) { AUBIO_ERR("error when trying to access %s, in ExtAudioFileOpenURL, %d\n", s->path, (int)err); goto beach;} // create an empty AudioStreamBasicDescription AudioStreamBasicDescription fileFormat; propSize = sizeof(fileFormat); memset(&fileFormat, 0, sizeof(AudioStreamBasicDescription)); // fill it with the file description err = ExtAudioFileGetProperty(s->audioFile, kExtAudioFileProperty_FileDataFormat, &propSize, &fileFormat); if (err) { AUBIO_ERROR("error in ExtAudioFileGetProperty, %d\n", (int)err); goto beach;} if (samplerate == 0) { samplerate = fileFormat.mSampleRate; //AUBIO_DBG("sampling rate set to 0, automagically adjusting to %d\n", samplerate); } s->samplerate = samplerate; s->source_samplerate = fileFormat.mSampleRate; s->channels = fileFormat.mChannelsPerFrame; AudioStreamBasicDescription clientFormat; propSize = sizeof(clientFormat); memset(&clientFormat, 0, sizeof(AudioStreamBasicDescription)); clientFormat.mFormatID = kAudioFormatLinearPCM; clientFormat.mSampleRate = (Float64)(s->samplerate); clientFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; clientFormat.mChannelsPerFrame = s->channels; clientFormat.mBitsPerChannel = sizeof(short) * 8; clientFormat.mFramesPerPacket = 1; clientFormat.mBytesPerFrame = clientFormat.mBitsPerChannel * clientFormat.mChannelsPerFrame / 8; clientFormat.mBytesPerPacket = clientFormat.mFramesPerPacket * clientFormat.mBytesPerFrame; clientFormat.mReserved = 0; // set the client format description err = ExtAudioFileSetProperty(s->audioFile, kExtAudioFileProperty_ClientDataFormat, propSize, &clientFormat); if (err) { AUBIO_ERROR("error in ExtAudioFileSetProperty, %d\n", (int)err); #if 1 // print client and format descriptions AUBIO_DBG("Opened %s\n", s->path); AUBIO_DBG("file/client Format.mFormatID: : %3c%c%c%c / %c%c%c%c\n", (int)RT_BYTE4(fileFormat.mFormatID), (int)RT_BYTE3(fileFormat.mFormatID), (int)RT_BYTE2(fileFormat.mFormatID), (int)RT_BYTE1(fileFormat.mFormatID), (int)RT_BYTE4(clientFormat.mFormatID), (int)RT_BYTE3(clientFormat.mFormatID), (int)RT_BYTE2(clientFormat.mFormatID), (int)RT_BYTE1(clientFormat.mFormatID) ); AUBIO_DBG("file/client Format.mSampleRate : %6.0f / %.0f\n", fileFormat.mSampleRate , clientFormat.mSampleRate); AUBIO_DBG("file/client Format.mFormatFlags : %6d / %d\n", (int)fileFormat.mFormatFlags , (int)clientFormat.mFormatFlags); AUBIO_DBG("file/client Format.mChannelsPerFrame : %6d / %d\n", (int)fileFormat.mChannelsPerFrame, (int)clientFormat.mChannelsPerFrame); AUBIO_DBG("file/client Format.mBitsPerChannel : %6d / %d\n", (int)fileFormat.mBitsPerChannel , (int)clientFormat.mBitsPerChannel); AUBIO_DBG("file/client Format.mFramesPerPacket : %6d / %d\n", (int)fileFormat.mFramesPerPacket , (int)clientFormat.mFramesPerPacket); AUBIO_DBG("file/client Format.mBytesPerFrame : %6d / %d\n", (int)fileFormat.mBytesPerFrame , (int)clientFormat.mBytesPerFrame); AUBIO_DBG("file/client Format.mBytesPerPacket : %6d / %d\n", (int)fileFormat.mBytesPerPacket , (int)clientFormat.mBytesPerPacket); AUBIO_DBG("file/client Format.mReserved : %6d / %d\n", (int)fileFormat.mReserved , (int)clientFormat.mReserved); #endif goto beach; } // compute the size of the segments needed to read the input file UInt32 samples = s->block_size * clientFormat.mChannelsPerFrame; Float64 rateRatio = clientFormat.mSampleRate / fileFormat.mSampleRate; uint_t segmentSize= (uint_t)(samples * rateRatio + .5); if (rateRatio < 1.) { segmentSize = (uint_t)(samples / rateRatio + .5); } else if (rateRatio > 1.) { AUBIO_WRN("up-sampling %s from %0.2fHz to %0.2fHz\n", s->path, fileFormat.mSampleRate, clientFormat.mSampleRate); } else { assert ( segmentSize == samples ); //AUBIO_DBG("not resampling, segmentSize %d, block_size %d\n", segmentSize, s->block_size); } // allocate the AudioBufferList if (createAubioBufferList(&s->bufferList, s->channels, segmentSize)) err = -1; return s; beach: AUBIO_FREE(s); return NULL; }